近段時(shí)間在讀孫維琴的《精通hibernate》,感覺收獲不少,對(duì)于hibernate檢索策略的第一部分,感覺其實(shí)就是幾張表,如果把幾張表搞清楚了,其他的也就無(wú)所謂了,幸而書中總結(jié)的很好,就摘錄如下:
注意:此版本主要是基于hibernate2.x版本。
類級(jí)別和關(guān)聯(lián)級(jí)別可選的檢索策略和默認(rèn)的檢索策略
檢索策略的作用域 |
可選的檢索策略 |
默認(rèn)的檢索策略 |
運(yùn)行時(shí)行為受影響的sesssion的檢索方法 |
類級(jí)別 |
立即檢索
延遲檢索 |
立即檢索 |
僅影響load()方法 |
關(guān)聯(lián)級(jí)別 |
立即檢索
延遲檢索
迫切左外連接檢索 |
多對(duì)一和一對(duì)一關(guān)聯(lián)為外連接檢索 |
影響load(),get(),find()方法 |
一對(duì)多和多對(duì)多關(guān)聯(lián)為立即檢索 |
三種檢索策略的運(yùn)行機(jī)制
檢索策略的類型 |
類級(jí)別 |
關(guān)聯(lián)級(jí)別 |
優(yōu)點(diǎn) |
缺點(diǎn) |
優(yōu)先考慮使用的場(chǎng)合 |
立即檢索 |
立即加載檢索方法指定的對(duì)象 |
立即加載與檢索方法指定的對(duì)象關(guān)聯(lián)的對(duì)象,可以設(shè)定批量檢索數(shù)量 |
對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便地從一個(gè)對(duì)象導(dǎo)航到與它關(guān)聯(lián)的對(duì)象 |
(1)select語(yǔ)句數(shù)目多;(2)可能會(huì)加載應(yīng)用程序不需要訪問(wèn)的對(duì)象,造成內(nèi)存空間的浪費(fèi) |
(1)類級(jí)別(2)應(yīng)用程序需要立即訪問(wèn)的對(duì)象(3)使用了二級(jí)緩存 |
延遲檢索 |
延遲加載檢索方法指定的對(duì)象 |
延遲加載與檢索方法指定的對(duì)象,可以設(shè)定批量檢索數(shù)量 |
由應(yīng)用程序決定需要加載那些對(duì)象,可以避免執(zhí)行多余的select語(yǔ)句,以及避免加載應(yīng)用程序不需要訪問(wèn)的對(duì)象。因此提高檢索性能,并能節(jié)省內(nèi)存空間 |
應(yīng)用程序如果希望訪問(wèn)游離狀態(tài)的代理類實(shí)例,必須保證它在持久化狀態(tài)時(shí)已經(jīng)被初始化 |
(1)一對(duì)多或多對(duì)多關(guān)聯(lián)(2)應(yīng)用程序不需要立即訪問(wèn)或者根本不會(huì)訪問(wèn)的對(duì)象 |
迫切左外連接檢索 |
不適用 |
通過(guò)左外連接加載與檢索方法指定的對(duì)象 |
(1)對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便地從一個(gè)對(duì)象導(dǎo)航到與它關(guān)聯(lián)的對(duì)象(2)使用了外連接,select語(yǔ)句數(shù)目少 |
(1)可能會(huì)加載應(yīng)用程序不需要訪問(wèn)的對(duì)象,造成內(nèi)存空間的浪費(fèi)(2)復(fù)雜的數(shù)據(jù)表連接也會(huì)影響檢索性能 |
(1)多對(duì)一或一對(duì)一關(guān)聯(lián)(2)應(yīng)用程序需要立即訪問(wèn)的對(duì)象(3)數(shù)據(jù)庫(kù)系統(tǒng)具有良好的表連接性能 |
映射文件中用于設(shè)定檢索策略的幾個(gè)屬性
屬性 |
可選值 |
默認(rèn)值 |
描述 |
lazy |
true或false |
hibernate2.x版本為false
hibernate3.x版本為true |
如果為true,表示使用延遲策略。在<class>和<set>中包含此屬性 |
outer-join |
auto、true或false |
在<many-to-one>和<one-to-one>元素中為auto;在<set>元素中為false |
如果為true,表示使用迫切左外連接檢索。在<many-to-one>、<one-to-one>和<set>元素中包含此屬性 |
batch-size |
正整數(shù) |
1 |
設(shè)定批量檢索的數(shù)量。如果設(shè)定此項(xiàng),合理的取值在3~10之間。僅適用于關(guān)聯(lián)級(jí)別的立即檢索和延遲檢索,在<class>和<set>元素中包含此屬性 |
Set元素的lazy和outer-join屬性
lazy屬性 |
outer-join屬性 |
檢索策略 |
false |
true |
采用立即檢索,這是默認(rèn)的檢索策略,當(dāng)使用hibernate二級(jí)緩存可以考慮使用立即檢索 |
false |
false |
采用迫切左外連接檢索。對(duì)于hibernate2.x版本,在映射文件中如果有多個(gè)<set>元素,只允許有一個(gè)<set>元素的outer-join屬性為true |
true |
false |
采用延遲檢索。這是優(yōu)先考慮的檢索策略 |
true |
true |
沒(méi)有任何意義 |
設(shè)置多對(duì)一關(guān)聯(lián)的檢索策略
(以客戶和訂單為例)
Order.hbm.xml的<many-to-one>元素的outer-join屬性 |
Customer.hbm.xml的<calss>元素的lazy屬性 |
檢索order對(duì)象時(shí),對(duì)關(guān)聯(lián)的customer對(duì)象使用的檢索策略 |
auto |
true |
延遲檢索 |
auto |
false |
迫切左外連接檢索 |
true |
true |
迫切左外連接檢索 |
true |
false |
迫切左外連接檢索 |
false |
true |
延遲檢索 |
false |
false |
立即檢索 |
注:
1默認(rèn)情況下,Hibernate 3對(duì)集合使用延遲select抓取,對(duì)返回單值的關(guān)聯(lián)使用延遲代理抓取。
2在Hibernate2.1中,lazy屬性的默認(rèn)值為“false”,而在Hibernate3.0中,lazy屬性的默認(rèn)值為“true”。
3FetchMode.LAZY 和 FetchMode.EAGER被廢棄。取而代之的分別為FetchMode.SELECT 和FetchMode.JOIN。