成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

論述Hibernate中抓取策略

開發(fā) 后端
Hibernate抓取策略(fetching strategy)是指:當應用程序需要在(Hibernate實體對象圖的)關聯(lián)關系間進行導航的時候, Hibernate如何獲取關聯(lián)對象的策略。

本文主要就Hibernate抓取策略加以分析,Hibernate抓取策略(fetching strategy)是指:當應用程序需要在(Hibernate實體對象圖的)關聯(lián)關系間進行導航的時候, Hibernate如何獲取關聯(lián)對象的策略。

抓取策略可以在O/R映射的元數(shù)據(jù)中聲明,也可以在特定的HQL 或條件查詢(Criteria Query)中重載聲明。

如下幾種Hibernate抓取策略

◆連接抓取(Join fetching) - Hibernate通過 在SELECT語句使用OUTER JOIN(外連接)來 獲得對象的關聯(lián)實例或者關聯(lián)集合。

◆查詢抓取(Select fetching) - 另外發(fā)送一條 SELECT 語句抓取當前對象的關聯(lián)實體或集合。除非你顯式的指定lazy="false"禁止 延遲抓取(lazy fetching),否則只有當你真正訪問關聯(lián)關系的時候,才會執(zhí)行第二條select語句。

◆子查詢抓取(Subselect fetching) - 另外發(fā)送一條SELECT 語句抓取在前面查詢到(或者抓取到)的所有實體對象的關聯(lián)集合。除非你顯式的指定lazy="false" 禁止延遲抓取(lazy fetching),否則只有當你真正訪問關聯(lián)關系的時候,才會執(zhí)行第二條select語句。

◆批量抓取(Batch fetching) - 對查詢抓取的優(yōu)化方案, 通過指定一個主鍵或外鍵列表,Hibernate使用單條SELECT語句獲取一批對象實例或集合。

Hibernate抓取策略會區(qū)分下列各種情況:

1.Immediate fetching,立即抓取 - 當宿主被加載時,關聯(lián)、集合或屬性被立即抓取。

2.Lazy collection fetching,延遲集合抓取- 直到應用程序對集合進行了一次操作時,集合才被抓取。(對集合而言這是默認行為。)

3."Extra-lazy" collection fetching,"Extra-lazy"集合抓取 -對集合類中的每個元素而言,都是直到需要時才去訪問數(shù)據(jù)庫。除非絕對必要,Hibernate不會試圖去把整個集合都抓取到內存里來(適用于非常大的集合)。

4.Proxy fetching,代理抓取 - 對返回單值的關聯(lián)而言,當其某個方法被調用,而非對其關鍵字進行get操作時才抓取。

5."No-proxy" fetching,非代理抓取 - 對返回單值的關聯(lián)而言,當實例變量被訪問的時候進行抓取。與上面的代理抓取相比,這種方法沒有那么“延遲”得厲害(就算只訪問標識符,也會導致關聯(lián)抓取)但是更加透明,因為對應用程序來說,不再看到proxy。這種方法需要在編譯期間進行字節(jié)碼增強操作,因此很少需要用到。

6.Lazy attribute fetching,屬性延遲加載 - 對屬性或返回單值的關聯(lián)而言,當其實例變量被訪問的時候進行抓取。需要編譯期字節(jié)碼強化,因此這一方法很少是必要的。

這里有兩個正交的概念:關聯(lián)何時被抓取,以及被如何抓取(會采用什么樣的SQL語句)。不要混淆它們!我們使用抓取來改善性能。我們使用延遲來定義一些契約,對某特定類的某個脫管的實例,知道有哪些數(shù)據(jù)是可以使用的。

1.操作延遲加載的關聯(lián)

默認情況下,Hibernate 3對集合使用延遲select抓取,對返回單值的關聯(lián)使用延遲代理抓取。對幾乎是所有的應用而言,其絕大多數(shù)的關聯(lián),這種策略都是有效的。

注意:假若你設置了hibernate.default_batch_fetch_size,Hibernate會對延遲加載采取批量抓取優(yōu)化措施(這種優(yōu)化也可能會在更細化的級別打開)。

然而,你必須了解延遲抓取帶來的一個問題。在一個打開的Hibernate session上下文之外調用延遲集合會導致一次意外。比如:

  1. s = sessions.openSession();  
  2. Transaction tx = s.beginTransaction();  
  3.               
  4. User u = (User) s.createQuery("from User u where u.name=:userName")  
  5.     .setString("userName", userName).uniqueResult();  
  6. Map permissions = u.getPermissions();  
  7.  
  8. tx.commit();  
  9. s.close();  
  10.  
  11. Integer accessLevel = (Integer) permissions.get("accounts");  // Error! 

在Session關閉后,permessions集合將是未實例化的、不再可用,因此無法正常載入其狀態(tài)。 Hibernate對脫管對象不支持延遲實例化. 這里的修改方法是:將permissions讀取數(shù)據(jù)的代碼 移到tx.commit()之前。

除此之外,通過對關聯(lián)映射指定lazy="false",我們也可以使用非延遲的集合或關聯(lián)。但是, 對絕大部分集合來說,更推薦使用延遲方式抓取數(shù)據(jù)。如果在你的對象模型中定義了太多的非延遲關聯(lián),Hibernate最終幾乎需要在每個事務中載入整個數(shù)據(jù)庫到內存中!

但是,另一方面,在一些特殊的事務中,我們也經常需要使用到連接抓取(它本身上就是非延遲的),以代替查詢抓取。 下面我們將會很快明白如何具體的定制Hibernate中的抓取策略。在Hibernate3中,具體選擇哪種抓取策略的機制是和選擇 單值關聯(lián)或集合關聯(lián)相一致的。

2.  調整抓取策略(Tuning fetch strategies)

查詢抓取(默認的)在N+1查詢的情況下是極其脆弱的,因此我們可能會要求在映射文檔中定義使用連接抓取:

  1. <set name="permissions"   
  2.             fetch="join"> 
  3.     <key column="userId"/> 
  4.     <one-to-many class="Permission"/> 
  5. set 
  6. <many-to-one name="mother" class="Cat" fetch="join"/> 

在映射文檔中定義的抓取策略將會對以下列表條目產生影響:通過get()或load()方法取得數(shù)據(jù)。只有在關聯(lián)之間進行導航時,才會隱式的取得數(shù)據(jù)。

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

不管你使用哪種抓取策略,定義為非延遲的類圖會被保證一定裝載入內存。注意這可能意味著在一條HQL查詢后緊跟著一系列的查詢。

通常情況下,我們并不使用映射文檔進行抓取策略的定制。更多的是,保持其默認值,然后在特定的事務中, 使用HQL的左連接抓取(left join fetch) 對其進行重載。這將通知 Hibernate在***次查詢中使用外部關聯(lián)(outer join),直接得到其關聯(lián)數(shù)據(jù)。 在條件查詢 API中,應該調用 setFetchMode(FetchMode.JOIN)語句。

也許你喜歡僅僅通過條件查詢,就可以改變get() 或 load()語句中的數(shù)據(jù)抓取策略。例如:

  1. User user = (User) session.createCriteria(User.class)  
  2.                 .setFetchMode("permissions", FetchMode.JOIN)  
  3.                 .add( Restrictions.idEq(userId) )  
  4.                 .uniqueResult(); 


(這就是其他ORM解決方案的“抓取計劃(fetch plan)”在Hibernate中的等價物。)截然不同的一種避免N+1次查詢的方法是,使用二級緩存。

【編輯推薦】

  1. 淺析Hibernate VO與PO區(qū)別
  2. Hibernate中merge()方法解析
  3. Hibernate中Criteria攻略詳解
  4. Hibernate的優(yōu)點全解
  5. 簡述Hibernate三種查詢的應用
責任編輯:仲衡 來源: javanb
相關推薦

2009-09-25 11:14:16

Hibernate批量

2009-09-25 15:15:54

Hibernate檢索

2009-06-26 16:27:10

Hibernate創(chuàng)建

2009-09-25 13:33:43

Hibernate主鍵

2009-09-25 14:20:28

Hibernate繼承映射

2009-06-18 11:25:26

Hibernate L

2009-09-22 14:12:16

Hibernate S

2009-09-25 10:47:25

Hibernate延遲

2009-06-16 16:10:59

Hibernate性能

2009-09-24 13:25:58

Hibernate m

2009-06-12 16:00:13

Session方法Hibernate

2009-06-16 15:42:44

Hibernate文檔

2009-06-18 10:07:03

CriteriaHibernate

2009-06-26 16:15:04

Criteria的用法Hibernate

2009-06-17 16:08:58

Hibernate C

2009-09-24 13:03:38

Hibernate C

2009-09-22 15:26:30

Hibernate多表

2009-06-29 08:59:05

hbm的generat

2009-06-17 14:17:40

Criteria條件查Hibernate

2009-09-22 09:40:03

cascade和invHibernate
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精品视频一区二区三区 | 永久www成人看片 | 久久久久久久国产精品影院 | a级毛片国产 | 欧美日韩在线看 | 99国产视频 | 国产精品日日摸夜夜添夜夜av | 亚洲在线高清 | 超碰免费在线 | 九九综合| 国产二区三区 | 久草视频2 | 偷拍自拍第一页 | 久久天天躁狠狠躁夜夜躁2014 | 国产精品美女久久久久久免费 | 在线观看黄色电影 | 一区二区三区视频在线免费观看 | 九一精品| 精品一区二区三区在线观看国产 | 成人午夜视频在线观看 | 亚洲福利在线观看 | 福利精品在线观看 | 成人伊人| 岛国av一区二区三区 | 精品一区二区在线观看 | 欧美综合国产精品久久丁香 | 亚洲视频在线观看 | 日韩一级免费电影 | 免费一级黄色 | 国产不卡在线观看 | 国产在线一区观看 | 色网站视频 | 欧美日韩视频在线播放 | 亚洲综合精品 | 欧美中文字幕一区二区三区亚洲 | 黄色毛片免费看 | 国产成人免费视频网站视频社区 | 婷婷综合在线 | 综合精品久久久 | 成人自拍视频 | www久久爱|