立即檢索、延遲檢索、迫切左外連線檢索
以下**為類級別和關聯級別可選的檢索策略及預設的檢索策略
檢索策略的作用域
可選的檢索策略
預設的檢索策略
執行時行為受影響的
session
的檢索方法
類級別立即載入
延遲載入
立即檢索
load()
方法關聯級別
立即載入
延遲載入
迫切左外連線檢索
多對一或者一對一為迫切左外連線檢索
一對多或者多對多為立即檢索
get()
、load()
、find()方法
屬性可選值
預設值描述
lazy
true
、false
false
如果為true
表示使用延遲載入,如果為
false
表示使用立即載入
outer-join
auto
、true
、false
在元素和
元素中為
auto
,在元素和
元素中為
false
如果為true
表示使用迫切左外連線檢索。在、、和
元素中包含此屬性
如果為false
表示使用立即載入
batch-size
正整數1
設定批量檢索的數量。如果設定此項合理的取值在3-
10之間
hibernate還允許在應用程式中以程式設計方式顯示設定檢索策略。程式**中的檢索策略會覆蓋對映檔案中配置的檢索策略,如果程式**沒有顯示設定檢索策略,則採用對映檔案中配置的檢索策略。
類級別可選的檢索策略包括立即檢索和延遲檢索,預設立即檢索。如果元素的lazy屬性為true,則表示採用延遲檢索;如果lazy屬性為false,則表示立即檢索。lazy屬性預設值為false。
在類級別中應該優先考慮使用立即檢索策略,因為在大多數情況下,當應用程式通過session的load()方法載入了乙個持久化類的物件後,總是立即訪問它。
延遲檢索:
當執行session的load()方法時,hibernate不會立即執行查詢customers表的select語句,僅僅返回customer類的**類例項,這個**類具有以下的特徵:
由hibernate在執行時動態產生,它擴充套件了customer類,因此它整合了customer類的所有屬性和方法,但它的實現對於應用程式是透明的。
當hibernate建立customer**類例項時,僅僅初始化它的oid屬性,其他屬性都為null,因此這個**類例項占用的記憶體很少。
當應用程式第一次訪問customer**類例項時(例如get、set方法,除了getid,因為id已經在**類中了),hibernate會初始化**類例項,初始化過程中執行select語句,真正從資料庫中載入customer物件的所有資料。
hibernate是採用cglib工具來生成持久化類的**類。
lazy屬性為true時,會影響session的load()方法的各種執行時行為:
①如果載入customer物件在資料庫中不存在,session的load()方法不會丟擲異常,只有當執行get方法時才會丟擲異常。
②如果在整個session範圍內,應用程式都沒有訪問過customer物件,那麼customer**類的例項一直不會被初始化,hibernate不會執行任何select語句。
③net.sf.hibernate.hibernate類的initialize()靜態方法用於在session範圍內顯示初始化**類例項,isinitialized()方法用於判斷**類例項是否已經被初始化。
值得注意的是,不管customer.hbm.xml檔案的元素的lazy屬性是true還是false,session的get()和find()方法在customer類級別總是使用立即檢索策略。
一對多和多對多關聯的檢索策略,屬性如下
lazy
屬性outer-join
屬性檢索策略
false
false
採用立即檢索,這是預設的檢索策略,當使用
hibernate
的第二級快取時,可以考慮採用立即檢索。
true
false
採用延遲檢索
false
true
採用迫切左外連線檢索,對於
hibernate2.0
以下,再對映檔案中如果有多個
元素,只允許有乙個
元素的outer-join
屬性為true
true
true
沒有任何意義
注意:對於
session.find()
方法會忽略迫切左外連線檢索,採用立即檢索策略(如果hql語句中自己撰寫了外連線,則會外連線檢索)
多對一和一對一關聯的檢索策略
以訂單和顧客為例,order
物件與custom
物件之間的多對一關係
order.hbml.xml
的元素的
outer-join
屬性custom.hbm.xml
的元素的
lazy
屬性檢索
order
物件時對關聯的
custom
物件使用的檢索策略
auto
true
延遲檢索
auto
false
迫切左外連線檢索
true
true
迫切左外連線檢索
true
false
迫切左外連線檢索
false
true
延遲檢索
false
false
立即檢索
設定元素的
batch-size,
這樣再進行查詢時能夠在
sql中採用
or連線詞
,減少查詢次數。
三種檢索模式比較:
檢索策略
優點缺點
適用性立即檢索
對應用程式完全透明,不管物件處於持久化狀態,還是游離狀態,應用程式都可以方便的從乙個物件導航到與它關聯的物件。
1.select語句太多;
2.可能會載入應用程式不需要訪問的物件白白浪費許多記憶體空間。
1.類級別
2.應用程式需要立即訪問的物件
3.使用了二級快取
延遲檢索
由應用程式決定需要載入哪些物件,可以避免可執行多餘的select語句,以及避免載入應用程式不需要訪問的物件。因此能提高檢索效能,並且能節省記憶體空間。
應用程式如果希望訪問游離狀態**類例項,必須保證他在持久化狀態時已經被初始化
。1.一對多或者多對多關聯
2.應用程式不需要立即訪問或者根本不訪問的物件
迫切左外連線
1.對應用程式完全透明,不管物件處於持久化狀態,還是游離狀態,應用程式都可以方便地衝乙個物件導航到與它關聯的物件。
2.使用了外連線,select語句數目少;
1.可能會載入應用程式不需要訪問的物件,白白浪費許多記憶體空間;
2.複雜的資料庫表連線也會影響檢索效能;
1.多對一或者一對一關聯
2.應用程式需要立即訪問的物件
3.資料庫系統具有良好的表連線效能
1、盡量使用迫切連線,以減少查詢資料庫的次數。
2、對使用延遲載入或者立即檢索策略設定批量 查詢數目,以檢索查詢資料庫的次數。
3、使用查詢快取
4、有的時候資料量較大,只負責顯示的資料可使用sql查詢,以減少快取空間。
5、儘量減少返回記錄集欄位的數目,只返回所需要的字段。
6、使用集合過濾,也就是說通過第一次查詢的結果來再次進行查詢。
hql方式與qbc方式的不同
1、hql方式功能強大,可實現分組,外連、內連,而qbc則沒有這些功能。
2、hql語句寫法接近sql語句方式,容易上手。
3、hql語句無法在編譯期檢查錯誤。而qbc能夠做到。
4、qbc是物件導向的,而hql語句還不是物件導向程式設計。
5、qbc能夠動態建立查詢,而hql不能
6、qbc提供了介面,擴充套件性好,hql方式不具有擴充套件性。
Hibernate 檢索策略
在預設情況下,當hibernate從資料庫中載入物件時,會同時載入所有關聯的物件.但實際應用中可能不需要使用其關聯的物件,這樣就可能通過設定hibernate的檢索策略,來優化檢索效能.hiberante提供了3種檢索策略 1 立即檢索 2 延遲檢索 3 迫切左外連線檢索 下面先從概念上去理解,先在...
Hibernate檢索策略
預設的檢索策略是立即檢索。在hibernate對映檔案中,通過在上配置 lazy屬性來確定檢索策略。對於session的檢索方式,類級別檢索策略僅適用於load方法 也就說,對於get qurey檢索,持久化物件都會被立即載入而不管lazy是false還是true.一般來說,我們檢索物件就是要訪問它...
hibernate 檢索策略
本文主要是學習hibernate的檢索策略 1 類級別的檢索策略有兩種一種是立即檢索,一種是延遲檢索,僅影響load操作 立即檢索,是類的預設檢索方式,或者設定了lazy false 也是立即檢索方式,即執行load操作之後會立馬返回相應的資料。延遲檢索,當類設定lazy true 時,hibern...