Hibernate的延遲載入問題

2021-09-20 17:02:12 字數 1569 閱讀 6701

一、延遲載入及作用?

延遲載入又叫懶載入。是指在訪問資料時,當資料用到的時候才被載入,沒有被用到的時候不載入。

二、這樣做有什麼好處呢?

好處就是每次訪問資料的時候,因為只載入需要的資料,這樣就可以降低資料庫以及記憶體壓力。

雖然說有時候整體的資料量並不多,但是這是一種機制,當資料量比較大的時候,對整體專案或者

方法呼叫的優化就會有明顯的效果。

三、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...