Hibernate:檢索策略的學習2

2018-09-28 14:25 更新

概述


本文是在進行Hibernate檢索策略學習過程中所總結(jié)的知識點的第二部分。其中在第一部分中,已經(jīng)學習了類級別的檢索策略以及1-N和N-N的檢索策略。在該文中將學習N-1和1-1的檢索策略,并對檢索策略進行總結(jié)。

N-1和1-1的檢索策略


這個小節(jié)中的內(nèi)容其實與第二部分的關于1-N和N-N部分有很多相似之處。只不過操作的對象不一樣。比如說,我們之前考慮的是在獲得了Customer時,如何獲取其對應的orders集合;而在該節(jié),我們考慮的是,在獲取了Order對象,如何獲取相對應的Customer。

在這里,我們需要考慮的是在Order.hbm.xml中的標簽的屬性,同樣,其也有l(wèi)azy屬性和fetch屬性:

lazy屬性(默認值proxy)fetch屬性(默認值select)檢索Order對象時對關聯(lián)的Customer對象使用的檢索策略
proxy未設置(取默認值select)采用延遲檢索策略
no-proxy未設置(取默認值select)無代理延遲檢索策略
false未設置(取默認值select)立即檢索
proxyjoin迫切左外連接檢索

需要注意的點:

  • 若fetch屬性設置為join,那么lazy屬性將被忽略;
  • 迫切左外連接檢索策略的優(yōu)點在于比立即檢索策略使用的SELECT語句更少;
  • no-proxy延遲檢索需要增強持久化類的字節(jié)碼才能實現(xiàn)。
  • Query的list方法會忽略映射文件配置的迫切左外連接檢索策略(join),而采用延遲檢索策略。

如果在關聯(lián)級別使用了延遲加載或立即加載檢索策略,可以設定批量檢索的大小,以幫助提高延遲檢索或立即檢索的運行性能。該屬性需要設置在 1 那一的 class 元素中,也就是Customer的元素:<class name="Customer" table="CUSTOMERS" lazy="true" batch-size="5">。其作用可以批量的初始化Customer對象。

總結(jié)


類級別和關聯(lián)級別可選的檢索策略

檢索策略作用域可選檢索策略默認檢索策略運行時行為受影響的檢索方法
類級別立即檢索
延遲檢索
延遲檢索僅影響Session的load()方法
關聯(lián)級別立即檢索
延遲檢索
迫切左外連接檢索
延遲檢索影響Session的load()方法和get()方法,以及Query API和Criteria
API,例外情況是Query API會忽略迫切左外連接策略

3種檢索策略的運行機制

檢索策略類型類級別關聯(lián)級別
立即檢索立即加載檢索方法指定的對象立即加載與檢索方法指定的對象的關聯(lián)對象,可以設定批量檢索數(shù)量
延遲檢索延遲加載檢索方法指定的對象延遲加載與檢索方式指定的對象的關聯(lián)對象,可以設定批量檢索數(shù)量
迫切左外連接不適用通過左外連接加載與檢索方法指定的對象的關聯(lián)對象

設定檢索策略的屬性

lazy

  • 類級別
    • 元素中l(wèi)azy屬性的可選值為true(延遲檢索)和false(立即檢索)
    • 元素的lazy屬性默認為true
  • 1-N和N-N關聯(lián)級別
    • 元素中l(wèi)azy屬性的可選值為true(延遲檢索)和false(立即檢索)
    • 元素的lazy屬性默認為true
  • 多對多關聯(lián)級別
    • 元素中l(wèi)azy屬性的可選值為proxy(延遲檢索)、no-proxy(無代理延遲檢索)和false(立即檢索)
    • 元素的lazy屬性默認為proxy

fetch

  • 類級別
    • 沒有此屬性
  • 1-N和N-N關聯(lián)級別
    • 元素中fetch屬性的可選值為select(select查詢語句)、subselect(帶子查詢的select語句)和join(迫切左外連接檢索)
    • 元素的fetch屬性默認為select
  • N-1和1-1關聯(lián)級別
    • 元素中fetch屬性的可選值為select(select查詢語句)和join(迫切左外連接檢索)
    • 元素的fetch屬性默認為select

batch-size

設定批量檢索的數(shù)量,可選值為一個正整數(shù),默認值為1。如果設定此項,合理的取值在3-10之間。僅適用于關聯(lián)級別的立即檢索和延遲檢索,在和元素中包含此屬性

三種檢索策略比較

立即檢索

  1. 優(yōu)點:對應用程序完全透明,無論對象處于持久化狀態(tài)還是游離狀態(tài)(session是否關閉),應用程序可以方便的從一個對象導航到與它相關的對象。
  2. 缺點:select語句數(shù)目多,可能會加載應用程序不需要訪問的對象,白白浪費內(nèi)存空間。
  3. 優(yōu)先考慮的場合:(1)類級別;(2)應用程序需要立即訪問的對象;(3)使用了二級緩存

延遲檢索

  1. 優(yōu)點:由應用程序決定需要加載哪些對象,可以避免執(zhí)行多余的select語句,以及避免加載應用程序不需要訪問的對象。因此能提高檢索性能,并且節(jié)省內(nèi)存空間。
  2. 缺點:應用程序如果希望訪問游離狀態(tài)的代理類實例,必須保證它在持久化狀態(tài)已經(jīng)被初始化。
  3. 優(yōu)先考慮的場合:(1)1-N關聯(lián)或者N-N關聯(lián);(2)應用程序不需要立即訪問或者根本不會訪問的對象

迫切左外連接檢索

  1. 優(yōu)點:對應用程序完全透明,不管對象處于持久狀態(tài),還是游離狀態(tài),應用程序可以方便的從一個對象導航到與它相關的對象。
  2. 缺點:可能會加載應用程序不需要訪問的對象,白白浪費內(nèi)存空間;復雜的數(shù)據(jù)庫表連接也會影響檢索性能。
  3. 優(yōu)先考慮的場合:(1)N-1或者N-N關聯(lián);(2)應用程序需要立即訪問的對象;(3)數(shù)據(jù)庫具有良好的表連接性能。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號