真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Hibernate里的Fetch有什么用

這篇文章主要為大家展示了“Hibernate里的Fetch有什么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Hibernate里的Fetch有什么用”這篇文章吧。

創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)涪陵,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792

現(xiàn)在越來(lái)越發(fā)現(xiàn)其實(shí)掌握Hibernate Fetch 并不容易,Spring用起來(lái)其實(shí)簡(jiǎn)單多了,但是在用Hibernate的時(shí)候真的是需要一定的時(shí)間積累,對(duì)一個(gè)項(xiàng)目組來(lái)說(shuō)如果采用Hibernate***有一個(gè)對(duì)Hibernate比較清楚的人否則碰到問(wèn)題就會(huì)成為項(xiàng)目的風(fēng)險(xiǎn)。
我想告訴各位的是,掌握Hibernate Fetch可能比你預(yù)期的難多了,當(dāng)你輕松的告訴我,Hibernate Fetch很簡(jiǎn)單的時(shí)候該是你自己多反省了. (只有一種情況例外,你是一個(gè)牛人)

好了,一個(gè)引子廢話那么多,其實(shí)今天只是想先說(shuō)一說(shuō)Hibernate Fetch的作用.

大家都知道,在Hibernate里為了性能考慮,引進(jìn)了lazy的概念,這里我們以Parent和Child為模型來(lái)說(shuō)明

public class Parent implements Serializable {       /** identifier field */      private Long id;       /** persistent field */      private List childs;       //skip all getter/setter method        }        public class Child implements Serializable {       /** identifier field */      private Long id;       /** persistent field */      private net.foxlog.model.Parent parent;       //skip all getter/setter method   }

在我們查詢Parent對(duì)象的時(shí)候,默認(rèn)只有Parent的內(nèi)容,并不包含childs的信息,如果在Parent.hbm.xml里設(shè)置lazy="false"的話才同時(shí)取出關(guān)聯(lián)的所有childs內(nèi)容.

問(wèn)題是我既想要Hibernate默認(rèn)的性能又想要臨時(shí)的靈活性該怎么辦?  這就是Fetch的功能。我們可以把fetch與lazy="true"的關(guān)系類比為事務(wù)當(dāng)中的編程式事務(wù)與聲明式事務(wù),不太準(zhǔn)確,但是大概是這個(gè)意思。

總值,fetch就是在代碼這一層給你一個(gè)主動(dòng)抓取得機(jī)會(huì).

Parent parent = (Parent)hibernateTemplate.execute(new HibernateCallback() {              public Object doInHibernate(Session session) throws HibernateException, SQLException {                  Query q = session.createQuery(                          "from Parent as parent "+                                  " left outer join fetch parent.childs " +                                  " where parent.id = :id"                  );                  q.setParameter("id",new Long(15));                  return (Parent)q.uniqueResult();              }           });           Assert.assertTrue(parent.getChilds().size() > 0);

你可以在lazy="true"的情況下把Fetch去掉,就會(huì)報(bào)異常. 當(dāng)然,如果lazy="false"就不需要fetch了有一個(gè)問(wèn)題,使用Fetch會(huì)有重復(fù)記錄的現(xiàn)象發(fā)生,我們可以理解為Fetch實(shí)際上不是為Parent服務(wù)的,而是為Child服務(wù)的.所以直接取Parent會(huì)有不匹配的問(wèn)題.

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

update:以上有些結(jié)論錯(cuò)誤,實(shí)際上在Hibernate3.2.1版本下測(cè)試,可以不出現(xiàn)重復(fù)記錄,

public void testNPlusOne() throws Exception{          List list = (List)hibernateTemplate.execute(new HibernateCallback() {              public Object doInHibernate(Session session) throws HibernateException, SQLException {                  Query q = session.createQuery(                          "select distinct p from net.foxlog.model.Parent p inner join fetch p.childs"                  );                  return q.list();              }           });           //((Parent)(list.get(0))).getChilds();          System.out.println("list size = " + list.size());          for(int i=0;i

打印結(jié)果如下:

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  list size = 3 ===parent = net.foxlog.model.Parent@1401d28[id=14]  ===parent's child's length = 1 ===parent = net.foxlog.model.Parent@14e0e90[id=15]  ===parent's child's length = 2 ===parent = net.foxlog.model.Parent@62610b[id=17]  ===parent's child's length = 3

另外,如果用open session in view模式的話一般不用Fetch,但首先推薦Fetch,如果非用的話因?yàn)橛蠳+1的現(xiàn)象,所以可以結(jié)合batch模式來(lái)改善下性能.

以上是“Hibernate里的Fetch有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)站欄目:Hibernate里的Fetch有什么用
鏈接分享:http://weahome.cn/article/ijscpc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部