預設的檢索策略是立即檢索。在hibernate對映檔案中,通過在上配置 lazy屬性來確定檢索策略。對於session的檢索方式,類級別檢索策略僅適用於load方法;也就說,對於get、qurey檢索,持久化物件都會被立即載入而不管lazy是false還是true.一般來說,我們檢索物件就是要訪問它,因此立即檢索是通常的選擇。由於load方法在檢索不到物件時會丟擲異常(立即檢索的情況下)
檢索策略可以分為:
1、 類級別的檢索
(1) hibernate3之前採用的都是立即檢索策略
(2) hibernate3採用的是延遲檢索策略:
(3)public voidfindbyid()
(5) 當執行上面幾行**時,控制台視窗中不會發出sql語句,只有在上面的方法中加system.out.println(cs.getemail());才會輸出sql語句。如下:
(6) hibernate: selectcustomers0_.id as id0_0_, customers0_.realname as realname0_0_,customers0_.pass as pass0_0_, customers0_.*** as ***0_0_, customers0_.petnameas petname0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from pros.customers customers0_ where customers0_.id=?
1) 立即檢索策略
優點:對應用程式完全透明,不管物件處於持久化狀態還是游離狀態,應用程式都可以從乙個物件導航到關聯的物件
缺點:1) select語句的數目太多,需要頻繁地訪問資料庫,會影響檢索效能。如果需要查詢n個customer物件,那麼必須執行n+1次select查詢語句。這種檢索策略沒有利用sql的連線查詢功能
2) 在應用邏輯只需要訪問customer物件,而不需要訪問order物件的場合,載入order物件完全是多餘的操作,這些多餘的order物件白白浪費了許多記憶體空間
優先考慮使用的場合:
(1)類級別
(2)應用程式需要立即訪問的物件
(3)使用了二級快取
2) 延遲檢索策略
a) 優點:
i. 由應用程式決定需要載入哪些物件,可以避免執行多餘的select,以及避免載入應用程式不需要訪問的物件。因此能提高檢索效能,並節省記憶體空間。
b) 缺點:
i. 應用程式如果希望訪問游離狀態的**類例項,必須保證她在持久化狀態時已經被初始化。
c) 優先考慮使用的場合:
i. (1)一對多或者多對多關聯
ii. (2)應用程式不需要立即訪問或者根本不會訪問的物件
2、 延遲檢索策略
迫切左外連線檢索策略
優點:(1) 對應用程式完全透明,不管物件處於持久化狀態還是游離狀態,都可從乙個物件導航到另乙個物件
(2) 使用了外連線,select語句少
缺點:(1) 可能會載入應用程式不需要訪問的物件,浪費記憶體
(2) 複雜的資料庫表連線也會影響檢索效能
優先考慮使用的場合:
(1) 多對一
(2) 需要立即訪問的物件
(3) 資料庫有良好的表連線效能
關聯級別檢索策略,要給它配置屬性fetch
在對映檔案中,用set元素來配置一對多關聯關係,set元素有lazy和fetch屬性
1、 lazy:主要決定orders集合被初始化的時機,既到底是在載入customer物件時被初始化還是在程式訪問orders集合時被初始化
2、 fetch:取值為select或subselect時,決定初始化orders的查詢語句的形式;若取值為join,則決定orders集合屬性被初始化的時機
3、 若把fetch設定為join,lazy屬性將被忽略
當fetch的值為join時,不管lazy的屬性值為什麼,採用的策略都是迫切左外聯接檢索
hibernate: selectcustomers0_.id as id0_1_, customers0_.realname as realname0_1_,customers0_.pass as pass0_1_, customers0_.*** as ***0_1_, customers0_.petnameas petname0_1_, customers0_.email as email0_1_, customers0_.rdate as rdate0_1_,orders1_.cid as cid0_3_, orders1_.id as id3_, orders1_.id as id1_0_,orders1_.number as number1_0_, orders1_.address as address1_0_, orders1_.phoneas phone1_0_, orders1_.odate as odate1_0_, orders1_.sum as sum1_0_,orders1_.status as status1_0_, orders1_.cid as cid1_0_ from pros.customerscustomers0_ left outer join pros.orders orders1_ on customers0_.id=orders1_.cidwhere customers0_.id=?
當fetch的值為select時,採用的策略主要根據lazy的取值決定
lazy=true
hibernate: selectcustomers0_.id as id0_0_, customers0_.realname as realname0_0_, customers0_.passas pass0_0_, customers0_.*** as ***0_0_, customers0_.petname as petname0_0_,customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ frompros.customers customers0_ where customers0_.id=?
lazy=false
hibernate: selectcustomers0_.id as id0_0_, customers0_.realname as realname0_0_,customers0_.pass as pass0_0_, customers0_.*** as ***0_0_, customers0_.petnameas petname0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from pros.customers customers0_ where customers0_.id=?
hibernate: select orders0_.cidas cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number asnumber1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_,orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_,orders0_.cid as cid1_0_ from pros.orders orders0_ where orders0_.cid=?
lazy=extra
hibernate: select customers0_.id as id0_0_,customers0_.realname as realname0_0_, customers0_.pass as pass0_0_,customers0_.*** as ***0_0_, customers0_.petname as petname0_0_,customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ frompros.customers customers0_ where customers0_.id=?
當fetch的值為subselect時,lazy的屬性值同樣分為false、true和extra三種情況,採用的檢索策略為巢狀子查詢(檢索多個customer物件時)lazy屬性決定檢索策略
Hibernate 檢索策略
在預設情況下,當hibernate從資料庫中載入物件時,會同時載入所有關聯的物件.但實際應用中可能不需要使用其關聯的物件,這樣就可能通過設定hibernate的檢索策略,來優化檢索效能.hiberante提供了3種檢索策略 1 立即檢索 2 延遲檢索 3 迫切左外連線檢索 下面先從概念上去理解,先在...
hibernate 檢索策略
本文主要是學習hibernate的檢索策略 1 類級別的檢索策略有兩種一種是立即檢索,一種是延遲檢索,僅影響load操作 立即檢索,是類的預設檢索方式,或者設定了lazy false 也是立即檢索方式,即執行load操作之後會立馬返回相應的資料。延遲檢索,當類設定lazy true 時,hibern...
hibernate 檢索策略
不浪費記憶體 提高查詢效率 lazy false 立即檢索 lazy true 延遲檢索 batch size x 批量預抓取數量設定 lazy true false extra true為延遲檢索 false為立即檢索 extra為增強延遲檢索 例如只使用size 方法,則只會傳送一條count的...