日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate的关键点精要

發布時間:2025/3/15 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate的关键点精要 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??????? 學習NHibernate,使用NHibernate總是有太多的疑惑。原來以后不就是個配置文件,后來才發現遠遠沒有那么簡單,這個配置文件又要照顧Entity Class,又要照顧數據庫腳本生成,更要照顧動態的SQL語句生成,所以現在想來碰到這么多問題也是正常了。這些問題,有些在同事間、或者自己琢磨已經有結果,但是有很多問題是直到看了孫姐姐的書《精通HIBERNATE:Java對象持久化技術詳解》,才豁然開朗。NHibernate組織自己也說,現在離1.0的最終發布版本差的就是文檔了,所以NHibernate文檔的缺乏更加加深了掌握的難度,但是幸好它是Hibernate的一個port,所以學習NHibernate最好的資料就是Hibernate的各種介紹和書籍了。下面就講我認為比較重要的一一列出了。

1、持久層開發的最佳路線圖:hbm->entity class->database scripts
hbm是信息最豐富的,所以由它作為驅動因素是最理想的,當然如果是項目的約束的影響那就另當別論了(比如數據庫已經設計好了)。從hbm->entity class可以使用NHibernateContrib庫(NHibernate官方開發的),最后生成database scripts的功能NHibernate庫已經自帶了。寫hbm實際上不困難,只有將NHibernate自帶的幾個xsd文件拷貝到VS相應目錄下就可以使用智能提醒了,寫起來可謂是運指如飛。另外有個叫Object Mapper的工具提供了從UML圖自動生成hbm的功能,不過我試了一下不是很爽,沒有直接寫快。

2、要Lazy Load,還是要清晰的DAL Service層?
(N)Hibernate一再強調Lazy Load的重要性,所他如何可以增加程序的性能,但是經過一段時間的研究發現Lazy Load固然好,但是可能會破壞企業應用架構。首先Lazy Load的使用有一個前提就是必須在同一個Session中,否則NHibernate給Lazy Load的類加的動態代理的事前攔截將無法捕獲合適的Session因此在后來讀Lazy Load的屬性時會去用已經關閉的Session,自然就會throw exception了。另外,按照依賴顛倒的原則,一般我們都這樣來BLL層下的架構“BLL ----> IDAL <--- DALImpl”,那么在DAL的每個方法中,必須經歷Session打開和關閉的過程,因此當BLL層獲得某個持久類,實際上是游離狀態的,即Session已經關閉,此時BLL層在去讀設置了Lazy Load的屬性,就注定失敗了。那么如何才能應用Lazy Load?一個辦法在BLL中用NHiberante的Session等,但這樣顯然破壞了原本清晰的架構。所以我的理解是:Lazy Load和清晰的DAL Service層,二者不可兼得。當然最好是我理解錯了,:)

3、inverse屬性
該屬性通常存在于雙向管理關系中的<set>等列表標簽中,其含義是“是否是鏡像”的含義。比如在many-to-one雙向關聯關系中One方的<set>標簽中若設置了inverse=true,則表示One方的關系設定只是一個鏡像,而該關系的最終生成SQL則完全用Many方決定。因此當運行一下腳本:

1One?theOne?=?new?One();
2Many?theMany?=?one?Many();
3
4//?此處省略常規屬性的賦值
5
6theOne.TheMany?=?theMany;
7theMany.OneList.Add(theOne);數據庫只會生成一條插入到TableMany中INSERT語句。
如果將One方<set>標簽中的inverse屬性改成false,則就會生成2條SQL語句,一條是插入到TableMany表中,第二條是UPDATE TableMany表中的外鍵使得其指向TableOne中的theOne記錄。其實道理也很簡單,如果“是否是鏡像”為否,則由One方自己控制,它能控制的方法就是UPDATE TableMany表了,所以就2條SQL語句了。由此也可以推出若One方的<set>標簽中若設置了inverse=true,代碼片斷中的第7行也可以不需要了。

4、實體類間組合關系
組合關系在UML中用實心的菱形表示,意思是同生共死。那么在NHibernate中就應該在父方加上cascade="all-delete-orphan"如下代碼所示:
1<set?
2????name="orders"?
3????cascade="all-delete-orphan"?
4????inverse=true>
5????<key?column="CustomerId"?/>
6????<one-to-many?class="Order"?/>
7</set>

這樣設置后NHibernate會幫助完成以下3件事情:
1、級聯保存或更新,相當于cascade屬性設置了"save-update"的情況。
2、級聯刪除,相當于cascade屬性設置了"delete"的情況。
3、刪除沒有父的所有子對象。

5、類圖中是2個類,但存儲使用一個表
這種情況很多,比如一個系統中有用戶和地址,在類圖中應該是2個類會比較清晰,但是有時確希望在數據庫中存放在1個表中,這時候可以用<component />標記,如下所示:

?1<class?name="User">
?2????<id?name="Id">
?3????????<generator?class="native"/>
?4????</id>
?5????<property?name="FirstName"/>
?6????<property?name="LastName"/>
?7????<component?name="Component"?class="UserSettings">
?8????????<property?name="Address1"/>
?9????????<property?name="Address2"/>
10????????<property?name="Street"/>
11????????<property?name="State"/>
12????????<property?name="Country"/>
13????</component>
14</class>


6、繼承關系的幾種映射方法
繼承關系的映射可以有3種方法:每個具體類映射一張表、全部映射成一張表、每個類映射一張表(包括抽象類),下面是實例,有一個基類:Animal,二個子類:Dog、Cat。

每個具體類映射一張表:

?1<class?name="Dog">
?2????<id?name="Id">
?3????????<generator?class="native"/>
?4????</id>
?5????<property?name="Name"/>
?6</class>
?7
?8<class?name="Cat">
?9????<id?name="Id">
10????????<generator?class="native"/>
11????</id>
12????<property?name="Name"/>
13</class>

這種方式實際上是沒有繼承,不能使用以下查詢語句:

1List?Animals?=?session.find("from?Animal");


全部映射一張表:

?1<class?name="Animal"?>
?2????<id?name="Id">
?3????????<generator?class="native"/>
?4????</id>
?5????<discriminator?column="Type"?type="string"?/>
?6????<property?name="Name"/>
?7
?8????<subclass?name="Dog"?discriminator-value="D">
?9????</subclass>
10
11????<subclass?name="Cat"?discriminator-value="C">
12????</subclass>
13
14</class>


每個類一個表(包括抽象類):

?1<class?name="Animal"?>
?2????<id?name="Id">
?3????????<generator?class="native"/>
?4????</id>
?5????<discriminator?column="Type"?type="string"?/>
?6????<property?name="Name"/>
?7
?8????<joined-subclass?name="Dog">
?9????????<key?column="DogId"?/>
10????</joined-subclass>
11
12????<joined-subclass?name="Cat">
13????????<key?column="CatId"?/>
14????</joined-subclass>
15</class>


7、如何告知hbm2DDL,我要生成ntext屬性?
type="StringClob"是不管用得,應該是type="String" 然后設置一個大于4000的值給length,如length=5000,即可。

轉載于:https://www.cnblogs.com/ron2k/archive/2005/08/16/215686.html

總結

以上是生活随笔為你收集整理的NHibernate的关键点精要的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。