hibernate中的延遲加載(lazyload)分屬性的延遲加載和關系的延遲加載
屬性的延遲加載:
當使用load的方式來獲取對象的時候,只有訪問了這個對象的屬性,hibernate才會到數據庫中進行查詢。否則不會訪問數據庫
Load的加載方式:
1、Load采用延遲加載的方式,hibernate的思想是既然這個方法支持延遲加載,它就認為這個對象一定在數據庫中存在,可以放心的使用代理來延遲加載,如果在使用過程中出現了問題就放心的拋異常
2、Load方法會首先查詢session緩存,看緩存中有沒有這個對象
3、如果緩存中沒有這個對象就會去創建個代理對象來管理,因為延遲加載需要代理來執行。但是並沒有去數據庫中查詢
4、只有當你實際使用這個對象的時候,它才會觸發sql語句。這個時候hibernate就會去查詢二級緩存和數據庫,如果數據庫中沒有這條語句,就拋出異常ObjectNotFoundException。
hibernate load方法加載實體對象的時候,會根據映射文件上 類級別 lazy屬性值的配置,分情況討論:
(1)若為true,即為延遲加載,就是上面的模式
(2)若為false,即為非延遲加載,即立即加載。就跟get方法查找順序一樣,只是最終若沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。
關系的延遲加載:
one-many many-many的時候都可以使用關系的延遲加載
元素中的lazy屬性的可選值為:true(延遲加載),extra(增強延遲加載)和false(立即加載);
元素中的lazy屬性的默認值為true
extra其實是一種比較智能的延遲加載,即調用集合的size/contains等方法的時候,hibernate並不會去加載整個集合的數據,而是發出一條聰明的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素對象數據的時候,才去發出查詢語句加載所有對象的數據。
hibernate在對象關系映射文件中配置加載策略的方式:(lazy)
1、類級別
元素中lazy屬性的可選值為true(延遲加載)和false(立即加載);
元素中的lazy屬性的默認值為true
2、一對多關聯級別:
元素中的lazy屬性的可選值為:true(延遲加載),extra(增強延遲加載)和false(立即加載);
元素中的lazy屬性的默認值為true
extra其實是一種比較智能的延遲加載,即調用集合的size/contains等方法的時候,hibernate並不會去加載整個集合的數據,而是發出一條聰明的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素對象數據的時候,才去發出查詢語句加載所有對象的數據。
3、多對一關聯級別:
元素中lazy屬性的可選值為:proxy(延遲加載),no-proxy(無代理延遲加載)和false(立即加載)
元素中的lazy屬性的默認值為proxy