概述
本文是在進行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) | 立即檢索 |
proxy | join | 迫切左外連接檢索 |
需要注意的點:
- 若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)級別的立即檢索和延遲檢索,在和元素中包含此屬性
三種檢索策略比較
立即檢索
- 優(yōu)點:對應用程序完全透明,無論對象處于持久化狀態(tài)還是游離狀態(tài)(session是否關閉),應用程序可以方便的從一個對象導航到與它相關的對象。
- 缺點:select語句數(shù)目多,可能會加載應用程序不需要訪問的對象,白白浪費內(nèi)存空間。
- 優(yōu)先考慮的場合:(1)類級別;(2)應用程序需要立即訪問的對象;(3)使用了二級緩存
延遲檢索
- 優(yōu)點:由應用程序決定需要加載哪些對象,可以避免執(zhí)行多余的select語句,以及避免加載應用程序不需要訪問的對象。因此能提高檢索性能,并且節(jié)省內(nèi)存空間。
- 缺點:應用程序如果希望訪問游離狀態(tài)的代理類實例,必須保證它在持久化狀態(tài)已經(jīng)被初始化。
- 優(yōu)先考慮的場合:(1)1-N關聯(lián)或者N-N關聯(lián);(2)應用程序不需要立即訪問或者根本不會訪問的對象
迫切左外連接檢索
- 優(yōu)點:對應用程序完全透明,不管對象處于持久狀態(tài),還是游離狀態(tài),應用程序可以方便的從一個對象導航到與它相關的對象。
- 缺點:可能會加載應用程序不需要訪問的對象,白白浪費內(nèi)存空間;復雜的數(shù)據(jù)庫表連接也會影響檢索性能。
- 優(yōu)先考慮的場合:(1)N-1或者N-N關聯(lián);(2)應用程序需要立即訪問的對象;(3)數(shù)據(jù)庫具有良好的表連接性能。
更多建議: