崔玉連,楊新鋒
面向數據集的開發模式和面向對象的領域模型是企業應用業務邏輯組織的兩種主要模式。
在面向數據集的開發模式中,系統開發框架提供了大量的數據感知組件使得開發者可以使用RAD組件快速開發基于DataSet的企業應用。該模式非常適合于中小型的企業應用程序開發,但是應對復雜的應用程序,隨著業務邏輯復雜度的增加其缺點就會逐步顯現。
首先,使用RAD和數據感知組件,就意味數據表現層同數據庫表的緊偶合,任何對數據模型的改變都會導致對所有綁定到改動的表或字段的數據感知組件的修改。其次,使用數據感知組件,意味著同數據庫的特有特性的耦合,當向不同數據庫平臺移植時,需要重新編寫大量的業務邏輯[1]。
因此,使用面向對象的企業應用開發框架來進行系統的開發越來越得到開發者的重視。但是由于對象和關系模型之間存在“阻抗不匹配”問題[2],因此把面向對象的一些操作映射到關系數據庫時,需要編寫繁瑣的數據訪問代碼,而這些代碼總是有大量重復內容。一旦數據層發生變化,就需要修改業務層的代碼來適應數據層的變化,導致系統難以維護。
開發人員試圖采用對象—關系映射 (ORM,Object Relational Mapping)組件來解決上述問題,即在業務層和數據層之間添加一個組件,將面向對象編程所建立的對象在數據庫中做一個映射,使之和數據庫中的表建立對應關系,把對表的直接操作變為對類的屬性和方法的操作[3]。用戶不需要為每個類編寫數據訪問代碼,把開發人員從重復的勞動中解脫出來,使之有更多時間和精力關注實際業務需求,從而提高系統的開發效率。
NHibernate是基于.NET的ORM開源框架,是來源于非常優秀的基于Java的 Hibernate關系型持久化工具。NHibernate從數據庫底層持久化.NET對象到關系型數據庫[4]。它不僅管理.NET類到數據庫表的映射,還提供數據查詢、獲取數據的方法和代碼自動生成機制,從而大幅度地減少開發人員直接使用SQL和ADO.NET處理數據的時間,擺脫了SQL、ADO.NET和事務、緩存等底層。
NHibernate具有以下特性:
對象持續性:能夠管理.Net類到數據庫表的映射,以對象的方式存取數據,支持復雜對象、復合對象,支持對象之間的關聯。OR Mapping的定義都是基于XML,具有很好的擴展性和通用性。可以支持現有的數據庫定義,很好地保護用戶投資。
支持對象查詢:提供了面向對象的查詢語言(HQL和條件查詢),可以根據條件查詢復合對象以及對象集合。
支持事務:創建還必須支持悲觀鎖的事務,并提供了樂觀鎖的并發支持。
性能優化:允許用戶使用定制的Sql來提高查詢的性能,提供了多種SQL自動策略開關,使得框架生成的Sql語句具有非常優化的性能。提供了靈活的Cache緩沖機制,以及延遲加載,批量更新的策略,保證一般應用的性能不會低于相應的數據集應用。
數據庫平臺無關性:使用OR Mapping技術實現了數據庫平臺無關性,可以隨時切換開發及數據庫發布平臺,方便移植。
NHibernate的體系結構,如圖1所示:

圖1 NHibernate體系結構
采用NHibernate后,.NET的系統架構仍然采用N層架構,界面層提供用戶的操作接口,業務邏輯層同傳統的N層架構一樣通過調用持久層接口實現了所有對數據庫的操作[5]。NHibernate持久化層實現了應用程序與數據庫的隔離,NHibernate會生成相應的SQL語句實現與數據庫的數據交互。持久化層封裝了使對象持久化的行為,即從持久化存儲對象中讀取、寫入、刪除對象。
由于關系模型主要組成成分是數據庫中的表和表與表之間的關系,而對象模型的主要組成成分是對象以及對象之間的聯系,因此為了消除對象模型與關系模型的不匹配問題,有必要在它們的組成成分間建立一個映射,這個映射包括結構映射和關系映射。NHibernate通過XML文件實現對象和關系數據庫表的結構映射和關系映射,用戶在XML文件中定義實體類和數據庫表的映射,XML文件必須以類名+.hbm.xml作為文件名[6][7]。NHibernate通過XML文件完成的映射關系,如圖2所示:

圖2 NHibernate通過XML文件完成的映射關系
全程辦稅及納稅評估系統是根據全程辦稅服務的實際情況,針對全程辦稅、指標管理、臺帳管理、評估性管理等方面進行信息化建設,初步建立起一個高集成度、高共享性的現代全程辦稅管理信息系統,為全程辦稅質量和效率的提高、評估管理的規范,提供了一個強大、持久、穩定的技術平臺。本系統共包括和全程辦稅服務的記錄與監督、科室與個人的指標性管理、納稅臺帳管理、評估性管理、管理五大模塊。本系統采用C#語言開發基于C/S架構的分布式信息管理系統。其中,NHibernate作為數據持久層來封裝對數據庫的操作。
依據系統設計強內聚、弱耦合的原則,以及劃分功能模塊要求設計簡單、權限分配方便,便于用戶理解的原則,本系統采用了4層架構,如圖3所示:

圖3 基于Nhibernate的全程辦稅及納稅評估系統框架
本系統的4層框架分別為:表示層、業務邏輯層、數據持久層和數據存儲層。其中,表示層利用C#進行編程,實現用戶界面;業務邏輯層封裝了全程辦稅的業務邏輯,通過定制業務訪問組件NHibernate,實現各業務邏輯模塊;數據持久層封裝了操作業務對象的持久化方法,利用Nhibernate進行對象-關系的映射,實現數據的持久操作。數據存儲層即數據庫服務器,負責數據的存儲、組織和管理。
(1)創建NHibernate數據庫連接
NHibernate數據庫連接由配置文件NHibernat.cfg.xml決定,文件中指定NHibernate所使用的數據庫以及用戶名、密碼及其他相關配置。本系統配置文件內容如下:


配置文件中參數的含義,如表1所示:

表1 配置文件中參數含義
(2)創建對象的相應持久化類
持久化類是指其實例需要持久化到數據庫的類。在持久化類中只定義屬性和屬性相對應的get、set方法,屬性和數據庫表的字段一一對應。
(3)創建映射文件
每個數據庫表對應一個NHibernate映射文件(命名格式為*.hbm.xml),用于生成數據模型。在映射文件中,需要定義數據存儲到哪個數據庫表,哪個屬性映射到數據庫表中的哪個列字段,不同的對象如何相互關聯。
具體來說,xml文件中的Class元素的name屬性指定了要進行映射的類的名稱, table屬性指定了要進行映射的類在數據庫中進行持久存儲的庫表名稱。Id元素用于聲明類標識屬性對應于數據庫表的主鍵字段的映射關系,其中name屬性標識類的標識屬性名稱,column屬性標識持久存儲的庫表的主鍵字段的名稱,type是標識字段的數據類型,而內嵌的generator元素則指明主鍵字段唯一值的生成方法,若其值為identity則表示NHibernate使用Sql Server數據庫本身提供的自增加字段的特性來保證鍵值唯一。
在運行過程中,NHibernate根據映射文件生成各種SQL語句。
(4)持久化操作的實現
建立映射文件和持久化類之后,可以很容易地實現針對單個持久類對象所有的基本操作,包括添加、刪除、更新和查找等。其基本過程為:
①加入NHibernate.dll的引用:
using NHibernate;
using Nhibernate.Cfg;
②創建configuration對象:
Configuration cfg=new Configuration();
cfg.AddAssembly("MyAssembly");
③創建會話對象通過調用Configuration對象的BuildSession-Factory方法創建SessionFactory對象,將Configuration對象包含的配置信息和SessionFactory發生關聯;然后通過調用SessionFactory對象的OpenSession方法創建Session對象,Session對象提供到后臺數據庫的鏈接;接著再通過調用Session對象的BeginTransaction方法創建可以被NHibernate管理的事務。

④加載、保存、查詢對象。通過調用ISessionFactory實例的openSession方法創建Session實例,最后通過Session接口的 save()、update()、delete()、load()和 find()等方法完成對數據庫對應表的操作,完成對持久對象類數據的存取。
⑤提交事務并關閉會話。
實踐表明,由于本系統采用了HNibernate實現對象-關系的映射,在對象檢索方式上節約了大量的資源,尤其當系統中進行大量數據查詢時尤為明顯。同時由于引入對象-關系映射技術,開發人員可以采用面向對象的方法來設計應用系統,用戶更改后臺數據庫也不會導致程序的修改,只需要對配置文件進行簡單的修改,從而降低程序維護和更新的成本,大大縮短了開發時間,提高了程序的可靠性。而且由于采用NHibernate實現了數據存儲和業務邏輯的分離,使得對各層進行獨立開發、跟蹤及優化成為了可能。
由于NHibernate的設計集成了很多操作數據庫方面的有效經驗,對生成的SQL語句進行最大限度的優化,可以高效地利用ADO.NET操作數據庫。但是,NHibernate也存在一些明顯的缺點與不足:為了實現對象與關系模型之間的映射,需要編寫復雜的XML映射文件且容易出錯;需要學習HQL語言,增加學習成本;NHibernate具有較大的靈活性,體系結構比較復雜,使用難度大;不支持存儲過程、不具備事務處理等數據庫高級功能[8]。這些都需要我們進一步研究和探討。
[1]陳省.NHibernate之Hello NHibernate[J].電腦編程技巧與維護,2004,10:42-45.
[2]劉金,徐蘇,馮豫華.基于Hibernate的J2EE數據持久層的設計與實現[J].計算機與現代化,2007,23(4):56-58.
[3]趙廣利.基于 NHibernate的數據持久化方案[J].計算機工程,2009,35(20):53-55.
[4]秦澤葉,高改梅.NHibernate在實驗室信息管理系統中的應用研究[J].科學之友,2010,10:40,43.
[5]李昕.NHibernate在.NET中的應用[J].福建電腦,2009,4:28,20.
[6]劉偉,嚴暉.利用NHibernate開發與數據庫無關的系統[J].計算機技術與發展,2007,17(7):105-107.
[7]陳龍.基于.NET平臺ORM 技術-NHibernate的研究與應用[D].長春:長春理工大學,2006.
[8]徐長盛,戴超,謝立.J2EE數據持久化技術的研究[J].計算機應用與軟件,2006,23(4):56-58.