天天看點

[NHibernate]立即加載

<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t1" target="_blank">寫在前面</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t2" target="_blank">文檔與系列文章</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t3" target="_blank">立即加載</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t4" target="_blank">一個例子</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t5" target="_blank">總結</a>

上篇文章介紹了nhibernate延遲加載的相關内容,簡單回顧一下延遲加載,就是需要的時候再去加載,需要的時候再向資料庫發出sql指令進行查詢。

本篇文章介紹的立即加載,則和延遲加載相對,舉個簡單的例子,就是查詢客戶資訊,則會将該客戶相關聯的資料立即進行加載。實作立即加載的方式有三種:設定映射檔案中節點的可選屬性lazy,nhibernate提供的實用類,hql抓取政策。

<a href="http://www.cnblogs.com/wolf-sun/p/3694592.html">[nhibernate]體系結構</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3694901.html">[nhibernate]isessionfactory配置</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3704012.html">[nhibernate]持久化類(persistent classes)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3705229.html">[nhibernate]o/r mapping基礎</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3720259.html">[nhibernate]關聯映射</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3721528.html">[nhibernate]parent/child</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3724052.html">[nhibernate]緩存(nhibernate.caches)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3734249.html">[nhibernate]nhibernate.tool.hbm2net</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3734313.html">[nhibernate]nullables</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3956802.html">[nhibernate]nhibernate如何映射sqlserver中image字段</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4046672.html">[nhibernate]條件查詢criteria query</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4048048.html">[nhibernate]增删改操作</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4049716.html">[nhibernate]事務</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4050714.html">[nhibernate]并發控制</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4067026.html">[nhibernate]元件之依賴對象</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4068749.html">[nhibernate]一對多關系(級聯删除,級聯添加)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4070935.html">[nhibernate]一對多關系(關聯查詢)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4074654.html">[nhibernate]多對多關系(關聯查詢)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html">[nhibernate]延遲加載</a>

1、一對多關系

通過立即加載的方式,加載客戶資訊及客戶的訂單資訊。

[NHibernate]立即加載
[NHibernate]立即加載

1.1、修改customer.hbm.xml檔案

因為nhibernate預設是使用lazy的方式加載資料的,也就是預設lazy=“true”的,需要顯示的指定lazy=“false”。

編寫一個測試驗證,調用資料通路層中的使用using強制資源清理session加載customer對象的方法加載一個customer對象,nhibernate這時立即加載customer相關聯的order對象。

[NHibernate]立即加載

利用nhibernate提供實用類(nhibernateutil)測試被關聯的customer對象集合是否已初始化(也就是已加載)。

[NHibernate]立即加載

上篇文章中也說明了,如果在關閉session的情況下,如果你展開customer的orders屬性,就會出現異常

[NHibernate]立即加載

這也說明了orders是跟customer一樣立即加載的。

檢視生成的sql語句

第一條sql為查詢customer的,第二條sql是查詢與該customer相關聯的order的。

1.2、使用nhibernateutil實用類

nhibernate提供實用類(nhibernateutil)可以用來檢測被關聯的對象集合是否已初始化,還可以強制初始化未初始化的相關聯的對象。有了這個功能,我們就可以修改資料通路層中的方法,把上面使用using強制清理關閉session的方法中加上nhibernateutil類提供initialize方法來初始化customer相關聯的order對象集合。

修改customer.hbm.xml檔案,将set節點的lazy屬性設定為預設值true,或者删除該屬性。

[NHibernate]立即加載
[NHibernate]立即加載

通過該種方式,跟上面的測試結果相同,就不再貼圖了。

2、多對多關系

2.1、使用lazy=“false”屬性

例子同上面的類似,就不再贅述。

2.2、使用nhibernateutil實用類

這裡采用order和product多對多執行個體進行分析。

如果想在加載order的情況下,加載該order下的所有product,可以使用nhibernateutil類初始化關聯對象(把他們從資料庫取出來)。

[NHibernate]立即加載
[NHibernate]立即加載

測試

[NHibernate]立即加載
[NHibernate]立即加載
[NHibernate]立即加載

這裡生成了三條sql語句,查詢和order關聯的customer和product。

2.3使用hql抓取政策

hql語句支援的連接配接類型為:inner join(内連接配接)、left outer join(左外連接配接)、right outer join(右外連接配接)、full join(全連接配接,不常用)。

“抓取fetch”連接配接允許僅僅使用一個選擇語句就将相關聯的對象随着他們的父對象的初始化而被初始化,可以有效的代替了映射檔案中的外聯接與延遲屬性聲明。

幾點注意: fetch不與setmaxresults() 或setfirstresult()共用,因為這些操作是基于結果集的,而在預先抓取集合時可能包含重複的資料,也就是說無法預先知道精确的行數。 fetch還不能與獨立的with條件一起使用。通過在一次查詢中fetch多個集合,可以制造出笛卡爾積,是以請多加注意。對多對多映射來說,同時join fetch多個集合角色可能在某些情況下給出并非預期的結果,也請小心。 使用full join fetch 與 right join fetch是沒有意義的。 如果你使用屬性級别的延遲擷取,在第一個查詢中可以使用 fetch all properties 來強制nhibernate立即取得那些原本需要延遲加載的屬性。

測試代碼

[NHibernate]立即加載
[NHibernate]立即加載

生成的sql語句

[NHibernate]立即加載

這篇文章介紹了nhibernate立即加載的方式,什麼時候使用立即加載,什麼時候使用延遲加載,視項目中的情況而定。

部落格位址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。

轉載:http://www.cnblogs.com/wolf-sun/p/4082432.html