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