Hibernate:檢索策略的學(xué)習(xí)2

2018-09-28 14:25 更新

概述


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

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


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

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

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

需要注意的點(diǎn):

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

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

總結(jié)


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

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

3種檢索策略的運(yùn)行機(jī)制

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

設(shè)定檢索策略的屬性

lazy

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

fetch

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

batch-size

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

三種檢索策略比較

立即檢索

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

延遲檢索

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

迫切左外連接檢索

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)