[原創]java WEB學習筆記88:Hibernate學習之路-- -Hibernate檢索策略(當即檢索,延遲檢索,迫切左外鏈接檢索)

本博客的目的:①總結本身的學習過程,至關於學習筆記 ②將本身的經驗分享給你們,相互學習,互相交流,不可商用

內容不免出現問題,歡迎指正,交流,探討,能夠留言,也能夠經過如下方式聯繫。

本人互聯網技術愛好者,互聯網技術發燒友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------數據庫

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 的三種檢索策略

 

               

相關文章
相關標籤/搜索