NHibernate是一個基於.Net的針對關係型數據庫的對象持久化(ORM)類庫。NHibernate來源於非常優秀的基於Java的NHibernate關係型持久化工具。從數據庫底NHibernate來持久化你的.Net 對象到關係型數據庫。NHibernate爲你處理這些,遠勝於你不得不寫SQL去從數據庫存取對象。你的代碼僅僅和對象關聯,NHibernate自動產生SQL語句,並確保對象提交到正確的表和字段中去。
Spring.NET對NHibernate提供了很好的支持與封裝。Spring.Data.NHibernate.Generic.Support和Spring.Data.NHibernate.Support下的HibernateDaoSupport是Spring.NET提供的數據庫訪問對象(DAO)的基類,兩者的卻別在於對泛型的支持程度。我們以Spring.Data.NHibernate.Generic.Support.HibernateDaoSupport爲例,講解Spring.NET整合NHibernate開發。
我歸納了一下,分爲三個步驟:
一、實體對象的建立及配置
二、數據訪問對象建立及配置
三、業務處理層建立及配置
首先讓我們學習一下NHibernate的實體對象的映射:我建立兩個實體“用戶信息”和“公司信息”。圖1所示。
圖1
NHibernate要求實體必須是帶有無參構造函數和帶有virtual修飾的屬性。兩個實體的關係是雙向(一對多——多對一)映射關係。
以上就是實體對象與數據的映射文件,提供的配置我不詳細說明,請查看NHibernate的幫助手冊。
接下來,我建立數據庫訪問對象(DAO)層。在這裏我使用了泛型Repository模式。
數據庫訪問對象我們可以讓它繼承於HibernateDaoSupport類,該類的HibernateTemplate屬性我們可以通過Spring.NET從外部注入。
db:provider節點是數據的連接字符串配置,我們引入xmlns:db="http://www.springframework.net/database這項命名空間便可以使用它。其中provider屬性爲數據庫提供者的名稱。以下是provider的詳細情況:
名稱 |
介紹 |
|
Microsoft SQL Server, provider V1.0.5.0 in framework .NET V1.1 |
|
Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0 |
|
Microsoft SQL Server Compact Edition, provider V9.0.242.0 |
|
Microsoft SQL Server Compact Edition, provider V3.5.1.0 |
|
provider V1.0.5000.0 in framework .NET V1.1 |
|
provider V2.0.0.0 in framework .NET V2.0 |
|
Oracle, Microsoft provider V2.0.0.0 |
|
Oracle, Oracle provider V2.102.2.20 |
|
MySQL provider 1.0.10.1 |
|
MySQL provider 1.0.9 |
|
MySQL provider 5.0.7.0 |
|
MySQL provider 5.0.8.1 |
|
MySQL provider 5.1.2.2 |
|
MySQL provider 5.1.2.2 |
|
MySQL provider 5.2.3.0 |
|
Postgresql provider 1.0.0.0 (and 1.0.0.1 - were build with same version info) |
|
Postgresql provider 1.98.1.0 beta 1 |
|
Postgresql provider 2.0.0.0 |
|
IBM DB2 Data Provider 9.0.0 for .NET Framework 1.1 |
|
IBM DB2 Data Provider 9.0.0 for .NET Framework 2.0 |
|
IBM DB2 Data Provider 9.1.0 for .NET Framework 1.1 |
|
IBM DB2 Data Provider 9.1.0 for .NET Framework 2. |
|
SQLite provider 1.0.43 for .NET Framework 2.0 |
|
SQLite provider 1.0.43 for .NET Framework 2.0 |
|
Sybase ASE provider for ASE 12.x |
|
Sybase ASE provider for ASE 15.x |
|
Sybase ADO.NET 2.0 provider for ASE 12.x and 15.x |
|
ODBC provider V1.0.5000.0 in framework .NET V1.1 |
|
ODBC provider V2.0.0.0 in framework .NET V2 |
InterSystems.Data.CacheClient |
Caché provider Version 2.0.0.1 in framework .NET V2 |
可以根據自己的數據庫選擇不同的提供者名稱。connectionString屬性爲數據庫的連接字符串,這裏用${xxx}的方式來表示一個佔位符,因爲我們經常將Spring.NET的配置文件設置爲“嵌入系統資源”,這樣一來在程序編譯後就不能夠修改,所以我們就要在應用程序配置文件中填寫連接字符串,而不是在Spring.NET的配置文件中填寫。
NHibernate中的Session控制取決於SessionFactory,Spring.NET提供了LocalSessionFactoryObject類來統一管理SessionFactory。其中MappingAssemblies屬性爲實體程序集的名稱,可以填寫多個名稱。HibernateProperties爲NHibernate的配置,dialect屬性爲數據庫的方言,因爲是SQL server 2K數據庫,所以使用NHibernate.Dialect.MsSql2000Dialect 。proxyfactory.factory_class屬性爲延遲加載的代理類驅動,在NHibernate 2.1版中必須配置。hbm2ddl.auto屬性爲反向建立映射表的配置,我們配置爲update後,NHibernate會幫我們自動根據實體的結構生成數據庫中的表。
接下來我們看一下業務處理層。
代碼的編寫我不仔細講,我們主要學習一下相關的配置。
我們在前幾篇學過AOP攔截和事務代理。Spring.NET爲NHibernate提供的事務代理是TransactionProxyFactoryObject。我們將改類的Target熟悉注入業務處理層的類,這樣Spring.NET會爲該類包裝上事務。
最後我們寫一個單元測試類,對業務層進行單元測試。
配置文件:
數據庫我沒有上傳,因爲空間的問題。我設置了自動建表的屬性,可以用來自動創建數據庫表結構。