一、NHibernate簡介

什麼是NHibernate?

NHibernate是一個物件導向在Dot NET環境的物件 / 關聯式資料庫映射工具。

物件/關聯式資料庫映射(Object/Relational Mapping,ORM)這個術語表示一種技術,用來把物件模型表示的物件映射到基於SQL的關係模型資料結構中去。

orm  

在今日的企業環境中,把物件導向的軟體和關聯式資料庫一起使用可能是相當麻煩和浪費時間的。

而NHibernate不僅僅管理.NET類到資料庫表的映射(包括.NET 資料類型到SQL資料類型的映射),還提供資料查詢和獲取資料的方法,可以大幅度減少開發時人工使用SQL和ADO.NET處理資料的時間。

NHibernate的目標主要是用於與資料持久化相關的程式設計任務,能夠使開發人員從原來枯燥的SQL語句的編寫中解放出來,解放出來的精力可以讓開發人員投入到業務邏輯的實現上。

對於以資料為中心的程式,開發人員往往是在資料庫中使用存儲過程來實現商業邏輯,這種情況下NHibernate可能不是最好的解決方案,但對於那些基於.NET,並且能夠實現OO業務模型和商業邏輯的中間層應用,NHibernate是最有用的。

NHibernate可以幫助用戶消除或者包裝那些針對特定廠商的SQL代碼,並且幫使用者把結果集從表格式的表示形式轉換成一系列的物件。

  

NHibernate是一個目前應用的最廣泛的開放原始程式碼的物件關係映射框架,它對Java的JDBC(類似於ADO.Net)進行了非常羽量級的物件封裝,使得程式師可以隨心所欲的使用物件程式設計思維來操縱資料庫,目前在國內Java開發界已經頗為流行,Hibernate+Spring往往是很多Java公司招聘的要求。

而NHibernate,顧名思義,如同NUnit,NAnt一樣,是基於.Net的Hibernate實現,但是目前介紹NHibernate的資料非常少,缺少一個系統完整的教程來全面的展現和深入NHibernate,而且現在NHibernate的文檔又殘缺不全,少的可憐,很多NHibernate的學習者往往都是通過Hibernate的文檔來學習,但是畢竟不是所有的.Net開發者都熟悉Java,也不是所有的人都有精力有時間去學習Java,所以有興趣的朋友能夠快速的熟悉NHibernate,能夠更快地體驗NHibernate的開發樂趣,底下的教學我覺得還不錯。

大陸的部落格:http://www.cnblogs.com/GoodHelper/category/214139.html

跟著Wade學習ASP.NET MVC+NHibernate:http://www.dotblogs.com.tw/wadehuang36/category/5745.aspx

NHibernate 是一個基於.Net 的針對關係型數據庫的對象持久化類庫。

NHibernate 來源於非常優秀的基於Java的Hibernate 關聯式持久化工具。

NHibernate 從資料庫底層來持久化你的.Net 對象到關係型數據庫。

NHibernate 為你處理這些,遠勝於你不得不寫SQL去從資料庫存取物件。

你的代碼僅僅和物件關聯,NHibernat 自動產生SQL語句,並確保物件提交到正確的表和欄位中去。

二、ORM簡介

什麼是ORM?物件-關係映射(Object/Relation Mapping,簡稱ORM),是隨著物件導向的軟體發展方法發展而產生的。

物件導向的開發方法是當今企業級應用開發環境中的主流開發方法,關聯式資料庫是企業級應用環境中永久存放資料的主流資料存儲系統。

物件和關係資料是業務實體的兩種表現形式,業務實體在記憶體中表現為物件,在資料庫中表現為關係資料。記憶體中的物件之間存在關聯和繼承關係,而在資料庫中,關係資料無法直接表達多對多關聯和繼承關係。

因此,物件-關係映射(ORM)系統一般以中介軟體的形式存在,主要實現程式物件到關聯式資料庫資料的映射。

  

物件導向是從軟體工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關聯式資料庫則是從數學理論發展而來的,兩套理論存在顯著的區別。為了解決這個不匹配的現象,物件關係映射技術應運而生。

  

讓我們從O/R開始。字母O起源於"物件"(Object),而R則來自於"關係"(Relational)。

幾乎所有的程式裡面,都存在物件和關聯式資料庫。

在業務邏輯層和使用者介面層中,我們是物件導向的。

當物件資訊發生變化的時候,我們需要把物件的資訊保存在關聯式資料庫中。

如果打開你最近的程式(如,PetShop4.0),看看DAL(資料庫訪問層)代碼,你肯定會看到很多近似的通用的模式。我們以保存物件的方法為例,你傳入一個物件,為SqlCommand物件添加SqlParameter,把所有屬性和物件對應,設置SqlCommand的CommandText屬性為存儲過程,然後運行SqlCommand。

對於每個物件都要重複的寫這些代碼。除此之外,還有更好的辦法嗎?有,引入一個O/R Mapping。

實質上,一個O/R Mapping會為你生成DAL。與其自己寫DAL代碼,不如用O/R Mapping。你用O/R Mapping保存,刪除,讀取對象,O/R Mapping負責生成SQL,你只需要關心對象就好。

這裡補充一下

按簡單傳統.NET對象(POCOs,Plain Old CLR Objects(Plain Ordinary CLR Object s))模型程式設計時需要持久化類,也可以說是DTO(Data Transfer Object,資料傳送物件) 模式(這是迄今為止可以工作的最簡單方式)。在NHibernate 中,POCO 通過.NET 的屬性機制存取資料,就可以把它映射成為資料庫表。底下有介紹一下POCO的名詞

http://www.dotblogs.com.tw/regionbbs/archive/2010/01/27/netfx.4.0.new.feature.ado.net.entity.framework.2.0.persistence.ignorant.object.overview.aspx

三、NHiberante的優缺點

3.1 優點

(1).物件導向:NHiberante的使用時只需要操縱物件,使開發更物件化,拋棄了資料庫中心的思想,完全的物件導向思想。

(2).透明持久化:帶有持久化狀態的、具有業務功能的單執行緒物件,此物件生存期很短。這些物件可能是普通的POCO,這個物件沒有實現協力廠商框架或者介面,唯一特殊的是他們正與(僅僅一個)Session相關聯。一旦這個Session被關閉,這些物件就會脫離持久化狀態,這樣就可被應用程式的任何層自由使用。(例如,用作跟展示層打交道的資料傳輸對象。)

(3).它沒有侵入性,即所謂的羽量級框架。正因為它具有透明持久化的優點,它才沒有侵入性,才是一個羽量級框架。恒定一個框架為重量級、還是羽量級,是根據其侵入性而定奪的。而NHibernate就是一個羽量級ORM框架。

(4).較好的移植性:支援多種資料庫,便於資料庫的遷移。

(5).緩存機制:提供一、二級緩存和查詢緩存。

(6).開發效率:眾所周知,使用NHibernate可以簡化程式開發,從而達到快速開發的目的。作為軟體公司,專案管理的關鍵就是控制開發成本。正因為使用NHibernate後所寫的代碼量減少了,相對于原先使用“SqlHelper、DAL、BLL”開發程式的專案週期縮短了,成本就降低了。

3.2 缺點

(1).記憶體消耗:直接使用“SqlHelper、DAL、BLL”無疑是最省記憶體的。使用NHibernate後,記憶體開銷比較大,這點是毋庸置疑的。

(2).批量資料庫的處理:由於NHibernate是基於物件導向的ORM框架,處理資料庫的方式是針對單個物件的。對資料庫的增、刪、改都是正對一條記錄而言。對於批量修改、刪除資料,不適合用NHiberante。這也是所有OR框架弱點,其原因,我認為是在於與緩存機制的衝突。

(3).較多使用資料庫特性時,也不適合使用NHiberante。如資料庫中大量的存儲過程、觸發器、特點的SQL語句。

(4).表關係比較混亂時也不適合使用NHiberante。NHibernate只適合於表與表的關係比較明確的環境中。如本應該建立外鍵的,沒有建立外鍵。這時使用NHiberante不僅沒有減少工作量,反而增加了工作量。

(5).學習成本:相對於NHibernate來說,使用“SqlHelper、DAL、BLL”操作資料庫,學習成本比較低,而且上手很快。使用NHibernate需要有一定OOP(物件導向程式設計)和OOD(物件導向設計)的基礎,這對於基礎薄弱的程式師來說,從面向過程的程式設計到物件導向的程式設計,需要一定的投入;一般情況下需要學習1個月左右的時間才能夠深入NHiberante。

四、NHibernate和Entity Framework比較?

目前公司主要是用NHibernate為主,所以之後有關ORM會依Nhibernate為主。

比較的參考網址:

NHibernate和Entity Framework 4.0優劣勢爭論:http://www.infoq.com/cn/news/2010/01/Comparing-NHibernate-EF-4

Entity Framework 和NHibernate的區別:http://blog.csdn.net/shanyou/article/details/4681358

NHibernate與Entity Framework性能比較:http://www.cnblogs.com/hiteddy/archive/2011/09/21/NHibernate_Entity_Framework_Performance_Compare.html

arrow
arrow
    文章標籤
    NHibernate ORM Hibernate
    全站熱搜

    Jimmy 發表在 痞客邦 留言(1) 人氣()