Hibernate中的延遲載入

2021-04-02 11:34:48 字數 1065 閱讀 7177

最近因為給新員工寫例子用到hibernate,才發現自己對hibernate的理解也非常有限啊.複雜的hql語言我寫不出來,還遇到了很多詭異的問題.在寫例子的過程中最困擾我的是hibernate的延遲載入特性.

眾所周知,到了hibernate3.0以後,關聯關係的物件預設都是使用延遲載入,例如時.但我在對映,關係時指定了lazy="true",但是在查詢物件時,我只想查詢乙個物件,仍然會把這個物件所關聯的,物件一起查詢出來,這樣造成了極大的效能浪費.在不指定lazy屬性時,所關聯的物件反而會延遲載入,這讓我大為困惑,還以為是hibernate的bug.

在網上查詢資料,說在為了延遲載入,所關聯的物件,需要設定被關聯的物件,我也這樣做了,但是仍然沒有效果.

仔細閱讀了hibernate的手冊,才發現原來要延遲載入,所關聯的物件時,除了要指定lazy="true"外,還需要執行期位元組碼增強,而我省去了這一步,所以延遲載入沒有效果.同時還發現在預設情況下,,的lazy屬性是"proxy"而不是"true"!因此如果直接採用lazy的預設值,是可以延遲載入的.

總結一下:

預設的屬性是lazy="proxy",此時預設是會延遲載入的.在指定了lazy="true"之後,必須要經過執行期位元組碼增加,延遲載入才有效果.

而相對要複雜一點,延遲載入還要受到

constrained屬性的限制.constrained="false"時表明實體和被關聯到的實體的約束不是強制的,即存在乙個實體時,它通過關聯的實體可能存在,也可能不存在,這時在查詢實體時,hibernate總會發起一次查詢檢查所關聯的實體是否存在,而這時已經可以把one-to-one關聯的實體查詢出來了,因此在關係中,如果constrained="false",總是會立即載入關聯到的實體.

如果當constrained="true",且lazy="proxy"(預設),是可以延遲載入的.

如果當constrained="true",且lazy="true"時,需要經過執行期位元組碼增加,延遲載入才會奏效.

(但是這裡我還是有個疑問,既然在lazy="proxy"時,已經實現了延遲載入的效果,為什麼在lazy="true"時,還需要動態位元組碼增強才能實現延遲載入呢?)

hibernate延遲載入

在hibernate應用中,有時候只訪問指定的持久化物件,在載入該物件時沒有必要載入其關聯的物件,以免浪費記憶體空間,但若想在session關閉後正常訪問該物件,必須在載入該物件時,一起載入該物件的關聯物件,為了滿足檢索持久化物件的不同情況的需求,開發靈活高效的hibernate應用,hiberna...

Hibernate的延遲載入問題

一 延遲載入及作用?延遲載入又叫懶載入。是指在訪問資料時,當資料用到的時候才被載入,沒有被用到的時候不載入。二 這樣做有什麼好處呢?好處就是每次訪問資料的時候,因為只載入需要的資料,這樣就可以降低資料庫以及記憶體壓力。雖然說有時候整體的資料量並不多,但是這是一種機制,當資料量比較大的時候,對整體專案...

Hibernate 延遲載入和立即載入

概念 什麼是延遲載入 所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。可以簡單理解為,只有在使用的時候,才會發出sql語句進行查詢,資料是分n次讀取。一 延遲載入 nhibernate延遲載入須有session存在,且配置為lazy true 預設 dal中編寫方法如下 延遲載入 p...