在網上查找資料,說在為了延遲加載<one-to-one>,<many-to-one>所關聯的對象,需要設置被關聯的對象<class name="" lazy="true">,我也這樣做了,但是仍然沒有效果.
仔 細閱讀了Hibernate的手冊,才發現原來要延遲加載<one-to-one>,<many-to-one>所關聯的對象 時,除了要指定lazy="true"外,還需要運行期字節碼增強,而我省去了這一步,所以延遲加載沒有效果.同時還發現在默認情況下,<one- to-one>,<many-to-one>的lazy屬性是"proxy"而不是"true"!因此如果直接采用lazy的默認值, 是可以延遲加載的.
總結一下:
<many-to-one>默認的屬性是lazy="proxy",此時默認是會延遲加載的.在指定了lazy="true"之后,必須要經過運行期字節碼增加,延遲加載才有效果.
而<one- to-one>相對要復雜一點,延遲加載還要受到constrained屬性的限制.constrained="false"時表明實體和被關聯到 的實體的約束不是強制的,即存在一個實體時,它通過<one-to-one>關聯的實體可能存在,也可能不存在,這時在查詢實體 時,Hibernate總會發起一次查詢檢查<one-to-one>所關聯的實體是否存在,而這時已經可以把one-to-one關聯的實 體查詢出來了,因此在<one-to-one>關系中,如果constrained="false",總是會立即加載關聯到的實體.
如果當constrained="true",且lazy="proxy"(默認),是可以延遲加載的.
如果當constrained="true",且lazy="true"時,需要經過運行期字節碼增加,延遲加載才會奏效.
但是這里我還是有個疑問,既然在lazy="proxy"時,已經實現了延遲加載的效果,為什么在lazy="true"時,還需要動態字節碼增強才能實現延遲加載呢?
Re: Hibernate中的延遲加載
以后在one-to-one或many-to-one中不會再有lazy="true"了,你可以理解成no-proxy.
[1]起碼還是好的方向: 默認就可以lazy了. 而且來了extra :)
[2]寫Hibernate的哥們也是要活命的嘛, 不改變怎么來的咨詢費, 不過Hibernate的migration寫的也還不錯.
[3]constrained如你所說, 而且我估計這個屬性以后不會有太大變更.
1)如果需要代理的類實現了一個接口,那么這些框架就在運行時使用reflect反射機制來創建一個實現了此接口的類作為代理類。
2)如果這個類沒有實現任何接口,那么就會使用cglib庫提供的方法來動態創建一個此類的子類作為代理類。其實也是使用了反射機制。cglib就是處理第二種情況的一個通用框架。
方法是:在主控方的<one-to-one>上加constrained=true,在被控方的class上加lazy=true,其實這個方法是可以的
我們都知道,一對一有兩種實現方式,主鍵關聯和外鍵關聯
主鍵關聯:就是說兩個表的主鍵是一樣的
product(id,name) image(id,name)
其中image的id引用product的id,product是主,image是次
外鍵關聯:就是說是通過一個字段引用另一個表的主鍵
product(id,name) image(id,name,productid)
其中image的productid引用product的id,product是主,image是次
在主鍵關聯時,按如下進行實體映射,是可以實現延遲加載的


































當使用外鍵關聯是,如果按如下方式編寫映射文件,使不能進行延遲加載的


































為什么呢,我認為是在主方product中,有這樣一句話property-ref="product"
這句話的意思是說加外鍵關聯類的屬性,如果不指定這個屬性,關聯類的主鍵就會被使用
也就是說,如果不制定這個,在查找image時就會使用
select * from image where imageid==product_id 而不是
select * from image where productid==product_id
我們在知道product_id的時候,需要找image中productid等于product_id記錄,而不是用image的主鍵作為比較
去掉propery-def后,倒是可以延遲加載,但在讀取product.getImage()方法時會報沒有指定id記錄的異常,不過這也正常,我們怎么能用image的主鍵和product_id建立查詢條件呢
至于為什么這樣,我不是很清楚
總之:我目前的結論是:用主鍵關聯,可以延遲加載,用外鍵關聯,暫時不考慮延遲加載
至于為什么,希望能到大家的幫助