NHibernate 配置文件的处理和使用多数据库的多层架构思路(第二部分)
生活随笔
收集整理的這篇文章主要介紹了
NHibernate 配置文件的处理和使用多数据库的多层架构思路(第二部分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二、數據訪問層
這里演示了一個 一對多的例子:
兩個表:事件表和日志表,事件表 (1: n) 日志表.
以下是兩個實體類和對應的配置文件。我單獨建了一個項目來存放它們,它們不算是數據訪問層!數據訪問層、業務邏輯層、顯示層都要用它。
?
//-----------------------------------------------------------------------------------------//?模塊編號:030101
//?文件名:?EventTypeInfo.cs
//?描述:?EventTypeInfo?實體類
//?作者:ChenJie?
//?編寫日期:2007-4-27
//?Copyright?2007
//-----------------------------------------------------------------------------------------
using?System;
using?System.Collections;
namespace?Novelty.Model.LogRecordBlcok
{
????/**////?<summary>
????///?<para>EventTypeInfo?類</para>
????///?<para>操作事件類型</para>
????///?<para><see?cref="member"/></para>
????///?<remarks></remarks>
????///?</summary>
????public?class?EventTypeInfo?:?IComparable
????{
????????內部成員變量#region?內部成員變量
????????private?int?_eventId;
????????private?int?_eventParentId;
????????private?string?_eventName?=?string.Empty;
????????private?string?_description?=?string.Empty;
????????private?IList?_systemLogs;
????????#endregion
????????構造函數#region?構造函數
????????/**////?<summary>
????????///?默認的構造函數
????????///?</summary>
????????public?EventTypeInfo()
????????{
????????}
????????/**////?<summary>
????????///?構造函數
????????///?</summary>
????????///<param?name="eventId">事件源編號</param>
????????///<param?name="eventParentId">事件源父編號</param>
????????///<param?name="eventName">事件源名稱</param>
????????///<param?name="description">事件描述</param>
????????public?EventTypeInfo(int?eventId,?int?eventParentId,?string?eventName,?string?description)
????????{
????????????_eventId?=?eventId;
????????????_eventParentId?=?eventParentId;
????????????_eventName?=?eventName;
????????????_description?=?description;
????????}
????????#endregion
????????屬性#region?屬性
????????/**////?<summary>
????????///?事件源編號
????????///?</summary>
????????public?virtual?int?EventId
????????{
????????????get
????????????{
????????????????return?_eventId;
????????????}
????????????set
????????????{
????????????????if?(_eventId?==?value)
????????????????????return;
????????????????_eventId?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?事件源父編號
????????///?</summary>
????????public?virtual?int?EventParentId
????????{
????????????get
????????????{
????????????????return?_eventParentId;
????????????}
????????????set
????????????{
????????????????if?(_eventParentId?==?value)
????????????????????return;
????????????????_eventParentId?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?事件源名稱
????????///?</summary>
????????public?virtual?string?EventName
????????{
????????????get
????????????{
????????????????return?_eventName;
????????????}
????????????set
????????????{
????????????????if?(_eventName?==?value)
????????????????????return;
????????????????_eventName?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?事件描述
????????///?</summary>
????????public?virtual?string?Description
????????{
????????????get
????????????{
????????????????return?_description;
????????????}
????????????set
????????????{
????????????????if?(_description?==?value)
????????????????????return;
????????????????_description?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?系統日志列表
????????///?</summary>
????????public?virtual?IList?SystemLogs
????????{
????????????get
????????????{
????????????????if?(_systemLogs?==?null)
????????????????{
????????????????????_systemLogs?=?new?ArrayList();
????????????????}
????????????????return?_systemLogs;
????????????}
????????????set?{?_systemLogs?=?value;?}
????????}
????????#endregion
????????重載方法#region?重載方法
????????/**////?<summary>
????????///?根據關鍵字重新載?Equals?方法
????????///?</summary>
????????///?<param?name="obj">比較對象</param>
????????///?<returns>比較結果</returns>
????????public?override?bool?Equals(object?obj)
????????{
????????????if?(!(obj?is?EventTypeInfo))
????????????{
????????????????throw?new?InvalidCastException("比較的對象不是?EventTypeInfo?的類型!");
????????????}
????????????EventTypeInfo?eventTypeInfo?=?(EventTypeInfo)obj;
????????????return?_eventId?==?eventTypeInfo.EventId;
????????}
????????/**////?<summary>
????????///?獲得對象的?hash?值
????????///?</summary>
????????///?<returns></returns>
????????public?override?int?GetHashCode()
????????{
????????????int?hash?=?100;
????????????hash?=?100?*?_eventId.GetHashCode();
????????????return?hash;
????????}
????????/**////?<summary>
????????///?實現?IComparable?接口的比較方法
????????///?</summary>
????????///?<param?name="obj"></param>
????????///?<returns></returns>
????????public?int?CompareTo(object?obj)
????????{
????????????if?(!(obj?is?EventTypeInfo))
????????????{
????????????????throw?new?InvalidCastException("比較的對象不是?EventTypeInfo?的類型!");
????????????}
?????????????EventTypeInfo?eventTypeInfo?=?(EventTypeInfo)obj;
?????????????return?_eventId.CompareTo(eventTypeInfo.EventId);
????????}
????????#endregion
????}
}
//-----------------------------------------------------------------------------------------
//?模塊編號:
//?文件名:?SystemLogInfo.cs
//?描述:?SystemLogInfo?實體類
//?作者:ChenJie?
//?編寫日期:2007-5-11
//?Copyright?2007
//-----------------------------------------------------------------------------------------
using?System;
using?Novelty.Model.UserAccountBlcok;
namespace?Novelty.Model.LogRecordBlcok
{
????/**////?<summary>
????///?<para>SystemLogInfo?類</para>
????///?<para>操作日志表</para>
????///?<para><see?cref="member"/></para>
????///?<remarks></remarks>
????///?</summary>
????public?class?SystemLogInfo?:?IComparable
????{
????????內部成員變量#region?內部成員變量
????????private?int?_systemLogId;
????????private?DateTime?_operationTime;
????????private?string?_description?=?string.Empty;
????????private?string?_iPAddress?=?string.Empty;
????????private?decimal?_userSerial;
????????private?EventTypeInfo?_eventType;????????
????????#endregion
????????構造函數#region?構造函數
????????/**////?<summary>
????????///?默認的構造函數
????????///?</summary>
????????public?SystemLogInfo()
????????{
????????}
????????/**////?<summary>
????????///?構造函數
????????///?</summary>????????
????????///<param?name="systemLogId">日志編號</param>????????
????????///<param?name="operationTime">操作時間</param>
????????///<param?name="description">事件描述</param>
????????///<param?name="iPAddress">計算機地址</param>
????????///<param?name="userSerial">用戶序號</param>
????????///<param?name="eventType">事件對象</param>????????
????????public?SystemLogInfo(int?systemLogId,?DateTime?operationTime,?string?description,
????????????string?iPAddress,?decimal?userSerial,?EventTypeInfo?eventType)
????????{
????????????_systemLogId?=?systemLogId;
????????????_operationTime?=?operationTime;
????????????_description?=?description;
????????????_iPAddress?=?iPAddress;
????????????_eventType?=?eventType;
????????????_userSerial?=?userSerial;
????????}
????????#endregion
????????屬性#region?屬性
????????/**////?<summary>
????????///?日志編號
????????///?</summary>
????????public?virtual?int?SystemLogId
????????{
????????????get
????????????{
????????????????return?_systemLogId;
????????????}
????????????set
????????????{
????????????????if?(_systemLogId?==?value)
????????????????????return;
????????????????_systemLogId?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?操作時間
????????///?</summary>
????????public?virtual?DateTime?OperationTime
????????{
????????????get
????????????{
????????????????return?_operationTime;
????????????}
????????????set
????????????{
????????????????if?(_operationTime?==?value)
????????????????????return;
????????????????_operationTime?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?事件描述
????????///?</summary>
????????public?virtual?string?Description
????????{
????????????get
????????????{
????????????????return?_description;
????????????}
????????????set
????????????{
????????????????if?(_description?==?value)
????????????????????return;
????????????????_description?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?計算機地址
????????///?</summary>
????????public?virtual?string?IPAddress
????????{
????????????get
????????????{
????????????????return?_iPAddress;
????????????}
????????????set
????????????{
????????????????if?(_iPAddress?==?value)
????????????????????return;
????????????????_iPAddress?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?用戶序號
????????///?</summary>
????????public?virtual?decimal?UserSerial
????????{
????????????get
????????????{
????????????????return?_userSerial;
????????????}
????????????set
????????????{
????????????????if?(_userSerial?==?value)
????????????????????return;
????????????????_userSerial?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?事件類型對象
????????///?</summary>
????????public?virtual?EventTypeInfo?EventType
????????{
????????????get
????????????{
????????????????return?_eventType;
????????????}
????????????set
????????????{
????????????????if?(_eventType?==?value)
????????????????????return;
????????????????_eventType?=?value;
????????????}
????????}
????????#endregion
????????重載方法#region?重載方法
????????/**////?<summary>
????????///?根據關鍵字重新載?Equals?方法
????????///?</summary>
????????///?<param?name="obj">比較對象</param>
????????///?<returns>比較結果</returns>
????????public?override?bool?Equals(object?obj)
????????{
????????????if?(!(obj?is?SystemLogInfo))
????????????{
????????????????throw?new?InvalidCastException("比較的對象不是?SystemLogInfo?的類型!");
????????????}
????????????SystemLogInfo?systemLogInfo?=?(SystemLogInfo)obj;
????????????return?_systemLogId?==?systemLogInfo.SystemLogId;
????????}
????????/**////?<summary>
????????///?獲得對象的?hash?值
????????///?</summary>
????????///?<returns></returns>
????????public?override?int?GetHashCode()
????????{
????????????int?hash?=?100;
????????????hash?=?100?*?_systemLogId.GetHashCode();
????????????return?hash;
????????}
????????/**////?<summary>
????????///?實現?IComparable?接口的比較方法
????????///?</summary>
????????///?<param?name="obj"></param>
????????///?<returns></returns>
????????public?int?CompareTo(object?obj)
????????{
????????????if?(!(obj?is?SystemLogInfo))
????????????{
????????????????throw?new?InvalidCastException("比較的對象不是?SystemLogInfo?的類型!");
????????????}
????????????SystemLogInfo?systemLogInfo?=?(SystemLogInfo)obj;
????????????return?_systemLogId.CompareTo(systemLogInfo.SystemLogId);
????????}
????????#endregion
????}
}
EventTypeInfo.hbm.xml:
<?xml?version="1.0"?encoding="utf-8"??><hibernate-mapping?xmlns="urn:nhibernate-mapping-2.2">
????<class?name="Novelty.Model.LogRecordBlcok.EventTypeInfo,?Novelty.Model"?table="EventType">
????????<id?name="EventId"?column="EventId"?type="Int32"?unsaved-value="null">
????????????<generator?class="assigned"?/>
????????</id>
????????<property?name="EventParentId"?type="Int32">
????????????<column?name="EventParentId"?length="4"?sql-type="int"?not-null="true"/>
????????</property>
????????<property?name="EventName"?type="string">
????????????<column?name="EventName"?length="32"?sql-type="nvarchar"?not-null="true"/>
????????</property>
????????<property?name="Description"?type="string">
????????????<column?name="Description"?length="128"?sql-type="nvarchar"?not-null="false"/>
????????</property>
????????<bag?name="SystemLogs"?inverse="true"?lazy="true"?cascade="all-delete-orphan">
????????????<key?column="EventId"/>
????????????<one-to-many?class="Novelty.Model.LogRecordBlcok.SystemLogInfo,?Novelty.Model"/>
????????</bag>
????</class>
</hibernate-mapping>
SystemLogInfo.hbm.xml:
<hibernate-mapping?xmlns="urn:nhibernate-mapping-2.2">
????<class?name="Novelty.Model.LogRecordBlcok.SystemLogInfo,?Novelty.Model"?table="SystemLog">
????????<id?name="SystemLogId"?column="SystemLogId"?type="Int32"?unsaved-value="null">
????????????<generator?class="assigned"?/>
????????</id>
????????<property?name="OperationTime"?type="DateTime">
????????????<column?name="OperationTime"?length="8"?sql-type="datetime"?not-null="true"/>
????????</property>
????????<property?name="Description"?type="string">
????????????<column?name="Description"?length="128"?sql-type="nvarchar"?not-null="true"/>
????????</property>
????????<property?name="IPAddress"?type="string">
????????????<column?name="IPAddress"?length="15"?sql-type="nvarchar"?not-null="false"/>
????????</property>????????
????????<property?name="UserSerial"?type="Decimal">
????????????<column?name="UserSerial"?length="5"?sql-type="decimal"?not-null="true"/>
????????</property>????????
????????<many-to-one?name="EventType"?class="Novelty.Model.LogRecordBlcok.EventTypeInfo,?Novelty.Model">
????????????<column?name="EventId"?length="4"?sql-type="int"?not-null="true"?index="OperationEvent_FK"/>
????????</many-to-one>????????
????</class>
</hibernate-mapping>
??????? 上面的代碼太長了,你省略它們也不太影響思路。(為什么不早說?:) )
??????? 我們就舉一個數據層訪問類,它是操作 SystemLog 表的!
??????? 關于下面的代碼,我就解釋一下 Insert? 方法,它是整個數據層中思路最重要的部分!
??????? 由于EventTypeInfo 和 SystemLogInfo 和 是一對多的關系!所以我們在插入 SystemLogInfo 對象前,先創建EventTypeInfo 對象:
??????? 先獲得EventTypeInfo 的實體通用操作對象:
EntityControl<EventTypeInfo> eventTypeEntityControl = CommonDatabaseOperation<EventTypeInfo>.Instance.GetEntityControl(DEFAULT_DATABASE_IDENTIFIER);
??????? 然后通過EventTypeInfo 的實體通用操作對象來獲得EventTypeInfo 對象:
EventTypeInfo eventType = eventTypeEntityControl.GetEntity(eventId);
??????? 在這里我們就不需要強制轉換對象了,因為使用了范型類!當然,這里還不足以體現它的優越性!
??????? 由于我們聲明了全局變量:
private readonly EntityControl<SystemLogInfo> entityControl;
??????? 然后在構造函數中創建它:
entityControl = CommonDatabaseOperation<SystemLogInfo>.Instance.GetEntityControl("SystemDatabase");
??????? 然后在該類的各個方法中都可以使用屬于SystemLogInfo 的實體通用操作對象,其中在獲得對象或是對象列表時均不需要強制轉換對象。
??????? 這個數據訪問層類只寫了對應實體通用操作類中的一些方法,還應該包含其他方法!文件中沒有給出例子,但是我還是舉兩個例說一下。
??????? (1)比如批量刪除記錄,怎么辦?聽說NH的作者說要么不用NH,要么用SQL!已經用NH,那就只有SQL來進行批量刪除記錄。(可能是執行SQL 的代碼太簡單,或者擔心破壞面向對象操作的思想,或者其他,我不知道!)但是我們來進行處理SQL,特別是帶條件的SQL。因為條件各不相同,所以為什么我不把執行SQL的操作方法抽象出來放在實體通用操作類中,而是在各自需要的數據訪問層類寫各自的。
我在底層的SessionFactory類中放了一個方法:
public Configuration GetConfiguration(string assemblyName, string nhibernateConfigName, string connectionString);
?
??????? 通過它可以獲得 ISessionFactoryImplementor 類的對象,然后再獲得連接 IDbConnection 接口對象,然后再獲得cmd,將相應的參數值賦上,然后再進行 SQL 操作。
??????? 具體參考底層的 EntityControl 類中方法:
public IList<T> GetEntitiesByExecuteSQL(string sql)
??????? 它給出了執行 SQL 語句的思路。
??????? (2)多條件查詢!
??????? 這個就是完全和 NH相關,還是因為條件各不相同,我無法在實體通用操作類中完成!
??????? 這個可以參考底層的 EntityControl 類中方法:
public IList<T> GetEntities(string propertyName, object value)
??????? 還補充一類情況:
string hql = "FROM SystemLogInfo WHERE UserSerial = :UserSerial ";
IQuery q = session.CreateQuery(hql);
q.SetDemical("UserSerial ", userSerial );
q.SetMaxResults(number);
return q.List();
??????? 這個例子中的session底層的SessionFactory類的方法
public ISession OpenSession(string assemblyName, string nhibernateConfigName, string connectionString)
?中獲得。
??????? 這類查詢還有很多,這里只是簡單舉例,目的在于說明數據訪問層里面究竟包含一些什么東西。
??????? 《面向對象的NHibernate數據查詢語言-HQL》這篇文章關于查詢講的非常好,可供我們好好學習!
//-----------------------------------------------------------------------------------------
//?模塊編號:
//?文件名:?SystemLog.cs
//?描述:?SystemLog 數據層訪問類
//?作者:ChenJie?
//?編寫日期:2007-5-11
//?Copyright?2007
//-----------------------------------------------------------------------------------------
using?System;
using?System.Collections;
using?System.Collections.Generic;
using?System.Data;
using?Novelty.Model.LogRecordBlcok;
using?Novelty.CustomSystem;
using?Novelty.CustomSystem.NHibernateOperation;
using?Novelty.CustomSystem.NHibernateOperation.NHibernateModule;
namespace?Novelty.CustomSystem.LogStrategy.LogRecordBlcok
{
????/**////?<summary>
????///?SystemLog表的數據層訪問類
????///?</summary>
????internal?class?SystemLog
????{
????????常量#region?常量
????????/**////?<summary>
????????///?默認的數據庫標識符
????????///?</summary>
????????private?const?string?DEFAULT_DATABASE_IDENTIFIER?=?"SystemDatabase";
????????/**////?<summary>
????????///?HQL?查詢語句
????????///?</summary>
????????private?const?string?HQL_MAX_SYSTEM_LOG_ID?=?"SELECT?MAX?_MAX;(systemLog.SystemLogId)?FROM?SystemLogInfo?AS?systemLog";
????????#endregion
????????私有變量#region?私有變量
????????private?readonly?EntityControl<SystemLogInfo>?entityControl;
????????#endregion
????????構造函數#region?構造函數
????????/**////?<summary>
????????///?默認的構造函數
????????///?</summary>
????????public?SystemLog()
????????{
????????????entityControl?=?CommonDatabaseOperation<SystemLogInfo>.Instance.GetEntityControl("SystemDatabase");
????????}
????????#endregion
????????接口#region?接口
????????/**////?<summary>
????????///?將日志寫入到數據庫中
????????///?</summary>
????????///?<param?name="eventId">事件關編號</param>
????????///?<param?name="userSerial">用戶序號</param>????????
????????///?<param?name="clientAddress">客戶地址</param>???
????????///?<param?name="description">日志描述</param>
????????public?void?Insert(int?eventId,?decimal?userSerial,?string?clientAddress,?string?description)
????????{
????????????try
????????????{
????????????????EntityControl<EventTypeInfo>?eventTypeEntityControl?=?CommonDatabaseOperation<EventTypeInfo>.Instance.GetEntityControl(DEFAULT_DATABASE_IDENTIFIER);
????????????????EventTypeInfo?eventType?=?eventTypeEntityControl.GetEntity(eventId);
????????????????int?systemLogId?=?entityControl.GetDataFieldValue<int>(HQL_MAX_SYSTEM_LOG_ID,?0)?+?1;
????????????????SystemLogInfo?systemLogInfo?=
????????????????????new?SystemLogInfo(systemLogId,?DateTime.Now,?description,?clientAddress,?userSerial,?eventType);
????????????????entityControl.AddEntity(systemLogInfo);
????????????}
????????????catch?(Exception?exception)
????????????{
????????????????//記錄日志,?拋出異常,?不包裝異常?
????????????????ExceptionFacade.LogAndThrowAndNoWrapPolicy(exception);
????????????}
????????}
????????/**////?<summary>
????????///?獲得?SystemLogInfo?對象
????????///?</summary>
????????///<param?name="systemLogId">日志編號</param>
????????///?<returns>?SystemLogInfo?對象</returns>
????????public?SystemLogInfo?GetSystemLogInfo(int?systemLogId)
????????{
????????????return?entityControl.GetEntity(systemLogId);
????????}
????????/**////?<summary>
????????///?獲得?SystemLogInfo?對象的列表
????????///?</summary>????????
????????///?<returns>SystemLogInfo?對象列表</returns>
????????public?IList<SystemLogInfo>?GetSystemLogInfos()
????????{
????????????return?entityControl.GetEntities();
????????}
????????/**////?<summary>
????????///?獲得?SystemLogInfo?對象的數據集
????????///?</summary>
????????///?<returns>SystemLogInfo?對象的數據集</returns>
????????public?DataSet?GetAll()
????????{
????????????return?entityControl.ConvertToDataSet(entityControl.GetEntities());
????????}
????????/**////?<summary>
????????///?更新?SystemLogInfo?對象
????????///?</summary>
????????///?<param?name="systemLogInfo">SystemLogInfo?對象</param>
????????public?void?Update(SystemLogInfo?systemLogInfo)
????????{
????????????try
????????????{
????????????????entityControl.UpdateEntity(systemLogInfo,?systemLogInfo.SystemLogId);
????????????}
????????????catch?(Exception?exception)
????????????{
????????????????//記錄日志,?拋出異常,?不包裝異常?
????????????????ExceptionFacade.LogAndThrowAndNoWrapPolicy(exception);
????????????}
????????}
????????/**////?<summary>
????????///?刪除滿足條件的的?SystemLogInfo?對象
????????///?</summary>
????????///?<param?name="userSerial">用戶序號</param>
????????///?<returns>返回刪除的記錄數目數目</returns>
????????public?int?Delete(decimal?userSerial)
????????{
????????????int?count?=?0;
????????????return?count;
????????}
????????/**////?<summary>
????????///?刪除?SystemLogInfo?對象
????????///?</summary>
????????///?<param?name="systemLogInfo">SystemLogInfo?對象</param>
????????public?void?Delete(SystemLogInfo?systemLogInfo)
????????{
????????????try
????????????{
????????????????entityControl.DeleteEntity(systemLogInfo);
????????????}
????????????catch?(Exception?exception)
????????????{
????????????????//記錄日志,?拋出異常,?不包裝異常?
????????????????ExceptionFacade.LogAndThrowAndNoWrapPolicy(exception);
????????????}
????????}
????????#endregion
????}
}
?
NHibernate 配置文件的處理和使用多數據庫的多層架構思路(第一部分)
http://www.cnblogs.com/scucj/archive/2007/05/15/747688.html
NHibernate 配置文件的處理和使用多數據庫的多層架構思路(第三部分)
http://www.cnblogs.com/scucj/archive/2007/05/15/747698.html
轉載于:https://www.cnblogs.com/scucj/archive/2007/05/15/747695.html
總結
以上是生活随笔為你收集整理的NHibernate 配置文件的处理和使用多数据库的多层架构思路(第二部分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用SQL语句查找某数据库中所有存储过程
- 下一篇: SQL一些精妙