Hibernate的抓取策略

2022-09-22 20:48:13 字數 2345 閱讀 6538

一、hibernate的抓取策略

hibernate抓取策略是指當應用程式需要在關聯關係間進行導航的時候,hibernate如何獲取關聯物件的策略。

hibernate有如下幾種抓取策略:

1、鏈結抓取(join fetching):hibernate 通過在select語句中使用out join來獲取物件的關聯例項或者關聯集合。

2、查詢抓取(select fetching):傳送另外一條select語句抓取當前物件的關聯實體或者關聯集合。除非我們顯示地指定lazy=」false」禁止延遲抓取,否則只有當我們真正訪問了關聯關係的時候才會執行第二條select語句。

3、子查詢抓取:另外傳送一條select 語句抓取在前面查詢到(或者抓取到)的所有實體物件的關聯集合。除非你顯式的指定lazy="false" 禁止延遲抓取(lazyfetching),否則只有當你真正訪問關聯關係的時候,才會執行第二條select語句。

4、批量抓取(batch fetching) - 對查詢抓取的優化方案, 通過指定乙個主鍵或外來鍵列表,hibernate使用單條select語句獲取一批物件例項或集合。

hibernate會區分下列各種情況:

1、immediate fetching,立即抓取 - 當宿主被載入時,關聯、集合或屬性被立即抓取。

2、lazy collectionfetching,延遲集合抓取- 直到應用程式對集合進行了一次操作時,集合才被抓取。(對集合而言這是預設行為。)

3、"extra-lazy"collection fetching,"extra-lazy"集合抓取 -對集合類中的每個元素而言,都是直到需要時才去訪問資料庫。除非絕對必要,hibernate不會試圖去把整個集合都抓取到記憶體裡來(適用於非常大的集合)。

4、proxy fetching,**抓取 - 對返回單值的關聯而言,當其某個方法被呼叫,而非對其關鍵字進行get操作時才抓取。

5、"no-proxy"fetching,非**抓取 - 對返回單值的關聯而言,當例項變數被訪問的時候進行抓取。與上面的**抓取相比,這種方法沒有那麼「延遲」得厲害(就算只訪問識別符號,也會導致關聯抓取)但是更加透明,因為對應用程式來說,不再看到proxy。這種方法需要在編譯期間進行位元組碼增強操作,因此很少需要用到。

6、lazy attributefetching,屬性延遲載入 - 對屬性或返回單值的關聯而言,當其實例變數被訪問的時候進行抓取。需要編譯期位元組碼強化,因此這一方法很少是必要的。

二、選擇合理的抓取策略

定製合理的抓取策略對系統的提公升有很大的作用。

查詢抓取在n+1查詢的情況下是極其脆弱的,因此我們可能會要求在對映檔案中定義連線抓取(fetch=」join」)。

但是在對映檔案中定義的抓取策略將會產生以下影響:通過get()或者load()方法獲取資料。。只有在關聯之間進行導航時,才會隱式的取得資料。

條件查詢,使用了subselect抓取的hql查詢

不管使用哪種抓取策略,定義為非延時的類圖會保證一定裝載入記憶體,這就意味著一條hql查詢後緊跟著一系列的查詢。

所以我們一般是這樣做:通常情況下,我們並不使用對映檔案進行抓取策略的定製,更多的是,保持其預設值然後在待定事物中,適用hql的左連線對其進行過載。

hibernate推薦的做法也是最佳實踐:把所有物件關聯的抓取都設為lazy!然後在特定事務中進行過載。

這種考慮是基於:物件之間的關聯式錯綜複雜的,有時候哪怕我們只是乙個簡單的load,也會導致很多物件被load出來!所以在hibernate中,所有物件關聯都是lazy的。

四、hibernate的批量抓取

在hibernate中,對於關聯抓取,可以定義每次抓取資料的數量。批量地將資料載入記憶體,減少與資料庫互動的次數。在應用程式中可以定義預設的關聯抓取數量。

hibernate提供了兩種批量抓取方案:類級別和集合級別。

類級別的批量查詢。如果乙個session中需要載入30個student例項,在student中擁有乙個成員變數class,該class執行class物件。如果lazy=「true」,如果們需要變數整個student集合,每乙個student都需要getclass(),hibernate在預設情況下回執行30次select查詢語句,得到class物件。這個時候可以通過在對映檔案的class屬性,batch-size。

[html] 

…. ….

這樣hibernate將只需要執行兩次查詢即可:15,15。

集合級別的批量查詢。如果我們需要遍歷class所擁有的所有student物件,在session中需要載入30個class物件,遍歷class集合將會引起30次select查詢,每次查詢都會呼叫getstudents()。如果在class的對映定義中,允許對students進行批量抓取,則hibernate就會預先載入整個集合。

[html]

… 

hibernate 抓取策略

1.單端 對端是one,即many2one 1.1 在用many2one時,fetch可以採取select或者join.用select時,會另發一條語句載入關聯物件。用join時,用一條語句就查上來,相當於資料庫裡面的連線,內連線外連線取決於外來鍵是否允許為空。注意 這個規則僅適用於get或者loa...

Hibernate抓取策略

抓取策略指的是我們在獲取資料時,告訴hibernate以何種sql的方式去獲取,hibernate有三種抓取方式可供選擇,分別是select join subselect 該屬性只能在集合標籤和關聯關係標籤上使用。xml version 1.0 encoding utf 8 cn.hibernate...

hibernate 抓取策略

抓取策略 fetching strategy 抓取策略 fetching strategy 是指 當應用程式需要在 hibernate實體物件圖的 關聯關係間進行導航的時候,hibernate如何獲取關聯物件的策略。抓取策略可以在o r對映的元資料中宣告,也可以在特定的hql 或條件查詢 crite...