hibernate中的延遲載入(lazyload)分屬性的延遲載入和關係的延遲載入 屬性的延遲載入: 當使用load的方式來獲取對象的時候,只有訪問了這個對象的屬性,hibernate才會到資料庫中進行查詢。否則不會訪問資料庫 Load的載入方式:1、Load採用延遲載入的方式,hibernate的 ...
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