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

淺談Hibernate里的Fetch的作用

開發 后端
今天只是想先說一說Hibernate Fetch的作用.大家都知道,在Hibernate里為了性能考慮,引進了lazy的概念,這里我們以Parent和Child為模型來說明。

現在越來越發現其實掌握Hibernate Fetch 并不容易,Spring用起來其實簡單多了,但是在用Hibernate的時候真的是需要一定的時間積累,對一個項目組來說如果采用Hibernate***有一個對Hibernate比較清楚的人否則碰到問題就會成為項目的風險。
我想告訴各位的是,掌握Hibernate Fetch可能比你預期的難多了,當你輕松的告訴我,Hibernate Fetch很簡單的時候該是你自己多反省了. (只有一種情況例外,你是一個牛人)

好了,一個引子廢話那么多,其實今天只是想先說一說Hibernate Fetch的作用.

大家都知道,在Hibernate里為了性能考慮,引進了lazy的概念,這里我們以Parent和Child為模型來說明

  1. public class Parent implements Serializable {  
  2.  
  3.     /** identifier field */  
  4.     private Long id;  
  5.  
  6.     /** persistent field */  
  7.     private List childs;  
  8.  
  9.     //skip all getter/setter method  
  10.  
  11.      
  12. }     
  13.  
  14.  
  15.  
  16. public class Child implements Serializable {  
  17.  
  18.     /** identifier field */  
  19.     private Long id;  
  20.  
  21.     /** persistent field */  
  22.     private net.foxlog.model.Parent parent;  
  23.  
  24.     //skip all getter/setter method  
  25.  

在我們查詢Parent對象的時候,默認只有Parent的內容,并不包含childs的信息,如果在Parent.hbm.xml里設置lazy="false"的話才同時取出關聯的所有childs內容.

問題是我既想要Hibernate默認的性能又想要臨時的靈活性該怎么辦?  這就是Fetch的功能。我們可以把fetch與lazy="true"的關系類比為事務當中的編程式事務與聲明式事務,不太準確,但是大概是這個意思。

總值,fetch就是在代碼這一層給你一個主動抓取得機會.

  1. Parent parent = (Parent)hibernateTemplate.execute(new HibernateCallback() {  
  2.             public Object doInHibernate(Session session) throws HibernateException, SQLException {  
  3.                 Query q = session.createQuery(  
  4.                         "from Parent as parent "+  
  5.                                 " left outer join fetch parent.childs " +  
  6.                                 " where parent.id = :id"  
  7.                 );  
  8.                 q.setParameter("id",new Long(15));  
  9.                 return (Parent)q.uniqueResult();  
  10.             }  
  11.  
  12.         });  
  13.  
  14.         Assert.assertTrue(parent.getChilds().size() > 0); 

你可以在lazy="true"的情況下把Fetch去掉,就會報異常. 當然,如果lazy="false"就不需要fetch了有一個問題,使用Fetch會有重復記錄的現象發生,我們可以理解為Fetch實際上不是為Parent服務的,而是為Child服務的.所以直接取Parent會有不匹配的問題.

參考一下下面的這篇文章 Hibernate集合初始化

update:以上有些結論錯誤,實際上在Hibernate3.2.1版本下測試,可以不出現重復記錄,

  1. public void testNPlusOne() throws Exception{  
  2.         List list = (List)hibernateTemplate.execute(new HibernateCallback() {  
  3.             public Object doInHibernate(Session session) throws HibernateException, SQLException {  
  4.                 Query q = session.createQuery(  
  5.                         "select distinct p from net.foxlog.model.Parent p inner join fetch p.childs"  
  6.                 );  
  7.                 return q.list();  
  8.             }  
  9.  
  10.         });  
  11.  
  12.         //((Parent)(list.get(0))).getChilds();  
  13.         System.out.println("list size = " + list.size());  
  14.         for(int i=0;i<list.size();i++){  
  15.             Parent p = (Parent)list.get(i);  
  16.             System.out.println("===parent = " + p);  
  17.             System.out.println("===parent's child's length = " + p.getChilds().size());  
  18.         }  
  19.  
  20.     } 

打印結果如下:

  1. Hibernate: select distinct parent0_.id as id2_0_, childs1_.id as id0_1_, childs1_.parent_id as parent2_0_1_, childs1_.parent_id as parent2_0__, childs1_.id as id0__ from parent parent0_ inner join child childs1_ on parent0_.id=childs1_.parent_id  
  2. list size = 3 
  3. ===parent = net.foxlog.model.Parent@1401d28[id=14]  
  4. ===parent's child's length = 1 
  5. ===parent = net.foxlog.model.Parent@14e0e90[id=15]  
  6. ===parent's child's length = 2 
  7. ===parent = net.foxlog.model.Parent@62610b[id=17]  
  8. ===parent's child's length = 3 

另外,如果用open session in view模式的話一般不用Fetch,但首先推薦Fetch,如果非用的話因為有N+1的現象,所以可以結合batch模式來改善下性能.

【編輯推薦】

  1. Hibernate入門學習寶典
  2. Hibernate屬性簡單分析
  3. Struts-Spring-Hibernate案例
  4. 簡述Hibernate配置連接池
  5. 對Hibernate中get()與load()不同點分析
責任編輯:仲衡 來源: blogjava
相關推薦

2009-09-23 17:07:31

Hibernate C

2009-09-21 13:05:18

Hibernate u

2009-09-28 15:47:59

Hibernate O

2009-02-11 09:37:32

Hibernate分頁技術JSP

2009-09-25 09:21:27

Hibernate元數

2009-09-28 13:43:28

使用Hibernate

2009-09-25 10:53:40

Hibernate S

2009-09-29 10:46:58

Hibernate領域

2009-09-22 10:09:21

Hibernate S

2009-03-06 14:34:31

StrutsHibernateSpring

2009-06-05 09:52:25

struts分頁Hibernate

2009-09-24 12:50:23

Hibernate F

2009-09-29 16:16:58

Hibernate H

2010-08-31 17:12:24

DHCP作用域

2009-09-22 13:41:10

直接使用Hiberna

2009-09-27 10:02:29

定制Hibernate

2009-09-28 13:39:01

Hibernate工作

2009-06-29 18:21:29

Hibernate

2009-06-29 18:26:46

HibernateHQL查詢

2009-09-21 17:17:11

Hibernate二級
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区视频在线观看 | 亚洲欧美国产毛片在线 | 国产欧美一区二区精品久导航 | 日韩视频免费看 | 中文字幕第一页在线 | 国产精品久久久爽爽爽麻豆色哟哟 | 蜜桃一区二区三区在线 | 亚洲精品美女视频 | www.久久精品视频 | 日韩在线免费播放 | 手机看黄av免费网址 | 在线观看日本网站 | 国产伦精品 | 国产精品美女久久久久久免费 | 精品久久久久久亚洲综合网 | 97精品视频在线 | 婷婷福利视频导航 | 99亚洲精品视频 | 日本一二区视频 | 欧美一区二区三区久久精品 | 青青久草 | 天堂一区 | 国产精品久久久久久久久久久久 | 日韩欧美在线视频 | 亚洲精品久久久一区二区三区 | 国产日韩欧美在线 | 中文字幕一二三 | 国产日韩欧美激情 | 国产精品1区| 成人免费淫片aa视频免费 | 欧洲尺码日本国产精品 | 欧美一级黄带 | 久久99精品久久久久久国产越南 | 欧美国产精品 | 久久亚洲一区 | 日韩男人天堂 | 免费观看成人性生生活片 | 日韩色视频 | 久久国内| 亚洲第一成人影院 | 91偷拍精品一区二区三区 |