1. Hibernate的檢索策略概述:數據庫
檢索數據時的 2 個問題:
1.不浪費內存:當 Hibernate 從數據庫中加載 Customer 對象時, 若是同時加載全部關聯的 Order 對象, 而程序實際上僅僅須要訪問 Customer 對象, 那麼這些關聯的 Order 對象就白白浪費了許多內存.
2.更高的查詢效率:發送儘量少的 SQL 語句緩存
2. Hibernate的檢索策略主要分3種狀況:類級別的檢索策略、1-n或n-n對應的檢索策略、n-1或1-1對應的檢索策略工具
3. 類級別的檢索策略: 性能
•類級別可選的檢索策略包括當即檢索和延遲檢索,默認爲延遲檢索
– 當即檢索 : 當即加載檢索方法指定的對象– 延遲檢索 : 延遲加載檢索方法指定的對象。在使用具體的屬性時,再進行加載
• 類級別的檢索策略能夠經過 <class> 元素的 lazy 屬性進行設置•若是程序加載一個對象的目的是爲了訪問它的屬性,能夠採起當即檢索.•若是程序加載一個持久化對象的目的是僅僅爲了得到它的引用,能夠採用延遲檢索。注意出現懶加載異常!• 不管 <class> 元素的 lazy 屬性是 true 仍是 false,Session 的 get() 方法及 Query 的 list() 方法在類級別老是使用當即檢索策略•若 <class>元素的lazy屬性爲true或取默認值,Session 的 load()方法不會執行查詢數據表的 SELECT語句,僅返回代理類對象的實例,該代理類實例有以下特徵:
–由 Hibernate在運行時採用CGLIB工具動態生成–Hibernate 建立代理類實例時, 僅初始化其 OID 屬性–在應用程序第一次訪問代理類實例的非 OID屬性時,Hibernate 會初始化代理類實例
4. 一對多或多對多的檢索策略(1-n/n-n)fetch
•在映射文件中, 用<set>元素來配置一對多關聯及多對多關聯關係.<set> 元素有 lazy 和fetch屬性
– lazy : 主要決定 orders 集合被初始化的時機. 即究竟是在加載Customer對象時就被初始化,仍是在程序訪問orders集合時被初始化– fetch : 取值爲 「 select」 或 「 subselect 」 時 , 決定初始化 orders 的查詢語句的形式 ; 若取值爲」 join」, 則決定 orders 集合被初始化的時機– 若把 fetch 設置爲 「 join」, lazy 屬性將被忽略–<set> 元素的batch-size屬性:用來爲延遲檢索策略或當即檢索策略設定批量檢索的數量.批量檢索能減小SELECT語句的數目,提升延遲檢索或當即檢索的運行性能.•在延遲檢索(lazy屬性值爲true)集合屬性時,Hibernate 在如下狀況下初始化集合代理類實例
–應用程序第一次訪問集合屬性:iterator(),size(), isEmpty(),contains() 等方法–經過 Hibernate.initialize()靜態方法顯式初始化•加強延遲檢索(lazy屬性爲extra):與lazy=「true」相似.主要區別是 加強延遲檢索策略能進一步延遲 Customer 對象的 orders 集合代理實例的初始化時機:
–當程序第一次訪問 orders屬性的iterator()方法時,會致使orders集合代理類實例的初始化–當程序第一次訪問 order屬性的size(),contains() 和 isEmpty()方法時,Hibernate 不會初始化 orders集合類的實例,僅經過特定的select語句查詢必要的信息,不會檢索全部的Order對象
•<set> 元素有一個batch-size屬性,用來爲延遲檢索策略或當即檢索策略設定批量檢索的數量.批量檢索能減小SELECT語句的數目,提升延遲檢索或當即檢索的運行性能.•<set> 元素的fetch屬性: 取值爲 「 select」 或 「 subselect 」 時 , 決定初始化 orders 的查詢語句的形式; 若取值爲」join」,則決定orders集合被初始化的時機.默認值爲select•當 fetch屬性爲「subselect」 時
–假定 Session緩存中有n個orders集合代理類實例沒有被初始化,Hibernate 可以經過帶子查詢的 select語句,來批量初始化n個orders集合代理類實例– batch-size 屬性將被忽略–子查詢中的 select語句爲查詢CUSTOMERS表OID的SELECT語句•當 fetch屬性爲「join」 時:
–檢索 Customer對象時,會採用 迫切左外鏈接(經過左外鏈接加載與檢索指定的對象關聯的對象)策略來檢索全部關聯的Order對象– lazy 屬性將被忽略Query的list()方法會忽略映射文件中配置的迫切左外鏈接檢索策略,而依舊採用延遲加載策略spa
5. 多對一或一對一的檢索策略(n-1,1-1)代理
•和 <set>同樣,<many-to-one> 元素也有一個 lazy 屬性和fetch屬性.
– 若 fetch 屬性設爲 join, 那麼 lazy 屬性被忽略–迫切左外鏈接檢索策略的優勢在於比當即檢索策略使用的 SELECT語句更少.–無代理延遲檢索須要加強持久化類的字節碼才能實現
• Query 的 list 方法會忽略映射文件配置的迫切左外鏈接檢索策略 , 而採用延遲檢索策略•若是在關聯級別使用了延遲加載或當即加載檢索策略,能夠 設定批量檢索的大小, 以幫助提升延遲檢索或當即檢索的運行性能.•Hibernate容許在應用程序中覆蓋映射文件中設定的檢索策略
6. Hibernate3種檢索策略的比較:對象