一、延遲載入及作用?
延遲載入又叫懶載入。是指在訪問資料時,當資料用到的時候才被載入,沒有被用到的時候不載入。
二、這樣做有什麼好處呢?
好處就是每次訪問資料的時候,因為只載入需要的資料,這樣就可以降低資料庫以及記憶體壓力。
雖然說有時候整體的資料量並不多,但是這是一種機制,當資料量比較大的時候,對整體專案或者
方法呼叫的優化就會有明顯的效果。
三、hibernate中get方法和load方法區別?
1、hibernate中,對於get方法,是立即載入的,也就是會立刻從資料庫中查詢出資料,有資料就直接返回這個
資料,如果沒有對應的資料就會返回null;
而hibernate對於load方法,並不是立即去載入的,hibernate會認為要查詢的資料一定存在,所以會通過cglib生成乙個**物件,
當在使用到該物件的屬性的時候才會去查詢資料庫,但是此時如果資料庫中不存在該物件,就會丟擲異常:
error lazyinitializer:63 - exception initializing proxy(還有一種情況會出現此異常:當session關閉之後再呼叫該物件中的屬性 時,
一般這種情況發生在view層呼叫該物件的屬性,因為此時session已經是關閉的了的)。
所以在使用load方法丟擲異常並不是因為建立物件引起的,而是因為
呼叫了該物件中的屬性引起的。
2、查詢時涉及快取:
對於get方法,hibernate會先查詢一級快取session,然後查詢二級快取,如果還沒有的話就會去查詢資料庫,如果資料庫
中還有就返回null;
對於load方法,hibernate會先查詢一級快取session,沒有的話,就會建立**物件,當使用實際資料時才會去查詢二級
快取和資料庫。
四、解決延遲初始化錯誤的方法:
產生錯誤的原因:
延遲初始化錯誤是運用hibernate開發專案時最常見的錯誤。如果對乙個類或者集合配置了延遲檢索策略,
那麼必須當**類例項或**集合處於持久化狀態(即處於session範圍內)時,才能初始化它。
如果在游離狀態時才初始化它,就會產生延遲初始化錯誤。
解決方法:
1、不去將延遲載入物件進行初始化。
如果是乙個物件中的屬性可以將其忽略初始化:
配置:在該屬性的set方法上新增註解:@json(serialize=false)
2、將延遲載入的屬性在配置中配置為立即載入:lazy=false,lazy屬性預設是true;
3、在業務層session關閉之前,對延遲物件初始化。
4、opeansessionview配置 :opensessioninviewfilter,可將session開啟到表現層。
配置如下:
opensessioninviewfilter
org.springframework.orm.hibernate3.support.opensessioninviewfilter
opensessioninviewfilter/*
hibernate延遲載入
在hibernate應用中,有時候只訪問指定的持久化物件,在載入該物件時沒有必要載入其關聯的物件,以免浪費記憶體空間,但若想在session關閉後正常訪問該物件,必須在載入該物件時,一起載入該物件的關聯物件,為了滿足檢索持久化物件的不同情況的需求,開發靈活高效的hibernate應用,hiberna...
Hibernate中的延遲載入
最近因為給新員工寫例子用到hibernate,才發現自己對hibernate的理解也非常有限啊.複雜的hql語言我寫不出來,還遇到了很多詭異的問題.在寫例子的過程中最困擾我的是hibernate的延遲載入特性.眾所周知,到了hibernate3.0以後,關聯關係的物件預設都是使用延遲載入,例如時.但...
Hibernate 延遲載入和立即載入
概念 什麼是延遲載入 所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。可以簡單理解為,只有在使用的時候,才會發出sql語句進行查詢,資料是分n次讀取。一 延遲載入 nhibernate延遲載入須有session存在,且配置為lazy true 預設 dal中編寫方法如下 延遲載入 p...