概述
本文是在進(jìn)行Hibernate檢索策略學(xué)習(xí)過程中所總結(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部分有很多相似之處。只不過操作的對(duì)象不一樣。比如說,我們之前考慮的是在獲得了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) | 無代理延遲檢索策略 |
false | 未設(shè)置(取默認(rèn)值select) | 立即檢索 |
proxy | join | 迫切左外連接檢索 |
需要注意的點(diǎn):
- 若fetch屬性設(shè)置為join,那么lazy屬性將被忽略;
- 迫切左外連接檢索策略的優(yōu)點(diǎn)在于比立即檢索策略使用的SELECT語句更少;
- 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ù)量 |
迫切左外連接 | 不適用 | 通過左外連接加載與檢索方法指定的對(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(無代理延遲檢索)和false(立即檢索)
- 元素的lazy屬性默認(rèn)為proxy
fetch
- 類級(jí)別
- 1-N和N-N關(guān)聯(lián)級(jí)別
- 元素中fetch屬性的可選值為select(select查詢語句)、subselect(帶子查詢的select語句)和join(迫切左外連接檢索)
- 元素的fetch屬性默認(rèn)為select
- N-1和1-1關(guān)聯(lián)級(jí)別
- 元素中fetch屬性的可選值為select(select查詢語句)和join(迫切左外連接檢索)
- 元素的fetch屬性默認(rèn)為select
batch-size
設(shè)定批量檢索的數(shù)量,可選值為一個(gè)正整數(shù),默認(rèn)值為1。如果設(shè)定此項(xiàng),合理的取值在3-10之間。僅適用于關(guān)聯(lián)級(jí)別的立即檢索和延遲檢索,在和元素中包含此屬性
三種檢索策略比較
立即檢索
- 優(yōu)點(diǎn):對(duì)應(yīng)用程序完全透明,無論對(duì)象處于持久化狀態(tài)還是游離狀態(tài)(session是否關(guān)閉),應(yīng)用程序可以方便的從一個(gè)對(duì)象導(dǎo)航到與它相關(guān)的對(duì)象。
- 缺點(diǎn):select語句數(shù)目多,可能會(huì)加載應(yīng)用程序不需要訪問的對(duì)象,白白浪費(fèi)內(nèi)存空間。
- 優(yōu)先考慮的場(chǎng)合:(1)類級(jí)別;(2)應(yīng)用程序需要立即訪問的對(duì)象;(3)使用了二級(jí)緩存
延遲檢索
- 優(yōu)點(diǎn):由應(yīng)用程序決定需要加載哪些對(duì)象,可以避免執(zhí)行多余的select語句,以及避免加載應(yīng)用程序不需要訪問的對(duì)象。因此能提高檢索性能,并且節(jié)省內(nèi)存空間。
- 缺點(diǎn):應(yīng)用程序如果希望訪問游離狀態(tài)的代理類實(shí)例,必須保證它在持久化狀態(tài)已經(jīng)被初始化。
- 優(yōu)先考慮的場(chǎng)合:(1)1-N關(guān)聯(lián)或者N-N關(guān)聯(lián);(2)應(yīng)用程序不需要立即訪問或者根本不會(huì)訪問的對(duì)象
迫切左外連接檢索
- 優(yōu)點(diǎn):對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久狀態(tài),還是游離狀態(tài),應(yīng)用程序可以方便的從一個(gè)對(duì)象導(dǎo)航到與它相關(guān)的對(duì)象。
- 缺點(diǎn):可能會(huì)加載應(yīng)用程序不需要訪問的對(duì)象,白白浪費(fèi)內(nèi)存空間;復(fù)雜的數(shù)據(jù)庫表連接也會(huì)影響檢索性能。
- 優(yōu)先考慮的場(chǎng)合:(1)N-1或者N-N關(guān)聯(lián);(2)應(yīng)用程序需要立即訪問的對(duì)象;(3)數(shù)據(jù)庫具有良好的表連接性能。
更多建議: