掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate延遲加載,包括介紹在Web層進(jìn)行延遲加載等方面。

Hibernate延遲加載
Hibernate對(duì)象關(guān)系映射提供延遲的與非延遲的對(duì)象初始化。非延遲加載在讀取一個(gè)對(duì)象的時(shí)候會(huì)將與這個(gè)對(duì)象所有相關(guān)的其他對(duì)象一起讀取出來(lái)。這有時(shí)會(huì)導(dǎo)致成百的(如果不是成千的話(huà))select語(yǔ)句在讀取對(duì)象的時(shí)候執(zhí)行。這個(gè)問(wèn)題有時(shí)出現(xiàn)在使用雙向關(guān)系的時(shí)候,經(jīng)常會(huì)導(dǎo)致整個(gè)數(shù)據(jù)庫(kù)都在初始化的階段被讀出來(lái)了。當(dāng)然,你可以不厭其煩地檢查每一個(gè)對(duì)象與其他對(duì)象的關(guān)系,并把那些最昂貴的刪除,但是到***,我們可能會(huì)因此失去了本想在ORM工具中獲得的便利。
一個(gè)明顯的解決方法是使用Hibernate延遲加載機(jī)制。這種初始化策略只在一個(gè)對(duì)象調(diào)用它的一對(duì)多或多對(duì)多關(guān)系時(shí)才將關(guān)系對(duì)象讀取出來(lái)。這個(gè)過(guò)程對(duì)開(kāi)發(fā)者來(lái)說(shuō)是透明的,而且只進(jìn)行了很少的數(shù)據(jù)庫(kù)操作請(qǐng)求,因此會(huì)得到比較明顯的性能提升。這項(xiàng)技術(shù)的一個(gè)缺陷是延遲加載技術(shù)要求一個(gè)Hibernate會(huì)話(huà)要在對(duì)象使用的時(shí)候一直開(kāi)著。這會(huì)成為通過(guò)使用DAO模式將持久層抽象出來(lái)時(shí)的一個(gè)主要問(wèn)題。為了將持久化機(jī)制完全地抽象出來(lái),所有的數(shù)據(jù)庫(kù)邏輯,包括打開(kāi)或關(guān)閉會(huì)話(huà),都不能在應(yīng)用層出現(xiàn)。最常見(jiàn)的是,一些實(shí)現(xiàn)了簡(jiǎn)單接口的DAO實(shí)現(xiàn)類(lèi)將數(shù)據(jù)庫(kù)邏輯完全封裝起來(lái)了。一種快速但是笨拙的解決方法是放棄DAO模式,將數(shù)據(jù)庫(kù)連接邏輯加到應(yīng)用層中來(lái)。這可能對(duì)一些小的應(yīng)用程序有效,但是在大的系統(tǒng)中,這是一個(gè)嚴(yán)重的設(shè)計(jì)缺陷,妨礙了系統(tǒng)的可擴(kuò)展性。
在Web層進(jìn)行延遲加載
幸運(yùn)的是,Spring框架為Hibernate延遲加載與DAO模式的整合提供了一種方便的解決方法。以一個(gè)Web應(yīng)用為例,Spring提供了OpenSessionInViewFilter和 OpenSessionInViewInterceptor。我們可以隨意選擇一個(gè)類(lèi)來(lái)實(shí)現(xiàn)相同的功能。兩種方法唯一的不同就在于interceptor 在Spring容器中運(yùn)行并被配置在web應(yīng)用的上下文中,而Filter在Spring之前運(yùn)行并被配置在web.xml中。不管用哪個(gè),他們都在請(qǐng)求將當(dāng)前會(huì)話(huà)與當(dāng)前(數(shù)據(jù)庫(kù))線(xiàn)程綁定時(shí)打開(kāi)Hibernate會(huì)話(huà)。一旦已綁定到線(xiàn)程,這個(gè)打開(kāi)了的Hibernate會(huì)話(huà)可以在DAO實(shí)現(xiàn)類(lèi)中透明地使用。這個(gè)會(huì)話(huà)會(huì)為延遲加載數(shù)據(jù)庫(kù)中值對(duì)象的視圖保持打開(kāi)狀態(tài)。一旦這個(gè)邏輯視圖完成了,Hibernate會(huì)話(huà)會(huì)在Filter的doFilter方法或者Interceptor的postHandle方法中被關(guān)閉。
實(shí)現(xiàn)方法在web.xml中加入
hibernateFilter - org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
hibernateFilter *.do

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流