Hibernate(五)---檢索策略

(一)類級別的檢索策略
· 類級別可選的檢索策略包括立即檢索和延遲檢索, 默認爲延遲檢索;

  • 立即檢索: 立即加載檢索方法指定的對象;
  • 延遲檢索: 延遲加載檢索方法指定的對象。在使用具體的屬性時,再進行加載

· 類級別的檢索策略可以通過 <class> 元素的 lazy 屬性進行設置;
· 無論 <class> 元素的 lazy 屬性是 true 還是 false, Session 的 get() 方法及 Query 的 list() 方法在類級別總是使用立即檢索策略;
· 若 <class> 元素的 lazy 屬性爲 true 或取默認值, Session 的 load() 方法不會執行查詢數據表的 SELECT 語句, 僅返回代理類對象的實例, 該代理類實例有如下特徵:

  • 由 Hibernate 在運行時採用 CGLIB 工具動態生成;
  • Hibernate 創建代理類實例時, 僅初始化其 OID 屬性;
  • 在應用程序第一次訪問代理類實例的非 OID 屬性時, Hibernate 會初始化代理類實例;
    (二) 一對多和多對多的檢索策略
    I 在映射文件中, 用 <set> 元素來配置一對多關聯及多對多關聯關係. <set> 元素有 lazy 和 fetch 屬性:
    (1)lazy屬性:主要決定 orders 集合被初始化的時機. 即到底是在加載 Customer 對象時就被初始化, 還是在程序訪問 orders 集合時被初始化
  • ①. 1-n 或 n-n 的集合屬性默認使用懶加載檢索策略
  • ②. 可以通過設置 set 的 lazy 屬性來修改默認的檢索策略. 默認爲 true 並不建議設置爲 false.
  • ③. lazy 還可以設置爲 extra. 增強的延遲檢索. 該取值會儘可能的延遲集合初始化的時機!
    注:特別說明延遲檢索和增強延遲檢索
    這裏寫圖片描述
    (2)set 元素的 batch-size 屬性: 設定一次初始化 set 集合的數量.
    (3)set 集合的 fetch 屬性: 確定初始化 orders 集合的方式.

  • .默認值爲 select. 通過正常的方式來初始化 set 元素.

  • 可以取值爲 subselect. 通過子查詢的方式來初始化所有的 set 集合. 子查詢作爲 where 子句的 in 的條件出現, 子查詢查詢所有 1 的一端的 ID. 此時 lazy 有效.但 batch-size 失效.

  • 若取值爲 join. 則在加載 1 的一端的對象時, 使用迫切左外連接(使用左外鏈接進行查詢, 且把集合屬性進行初始化)的方式檢索 n 的一端的集合屬性,忽略 lazy 屬性.HQL 查詢忽略 fetch=join的取值(即會忽略映射文件中配置的迫切左外連接檢索策略),而依舊採用延遲加載策略.

總結:<set> 元素的 lazy 和 fetch 屬性
這裏寫圖片描述

II <many-to-one> 元素中的 lazy 屬性和 fetch 屬性.
這裏寫圖片描述
注:
①若 fetch 屬性設爲 join, 那麼 lazy 屬性被忽略
②迫切左外連接檢索策略的優點在於比立即檢索策略使用的 SELECT 語句更少.
③無代理延遲檢索需要增強持久化類的字節碼才能實現
(三)檢索策略小結
· 類級別和關聯級別可選的檢索策略及默認的檢索策略
這裏寫圖片描述
· 3 種檢索策略的運行機制
這裏寫圖片描述
· 映射文件中用於設定檢索策略的幾個屬性
這裏寫圖片描述
· 比較 Hibernate 的三種檢索策略
這裏寫圖片描述

發佈了43 篇原創文章 · 獲贊 5 · 訪問量 4832
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章