Hibernate里的Fetch有什么用

技术Hibernate里的Fetch有什么用这篇文章主要为大家展示了“Hibernate里的Fetch有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Hibernate

本文主要给大家展示“Fetch在Hibernate中有什么用”,简单易懂,条理清晰,希望能帮你解决疑惑。让边肖带领你学习《在冬眠中取东西有什么用》一文。

现在越来越发现掌握Hibernate Fetch并不容易。Spring实际上使用起来要简单得多,但是在使用Hibernate的时候确实需要积累一定的时间。对于一个项目团队来说,如果使用Hibernate***,会有一个对Hibernate很了解的人,否则遇到问题就会变成项目风险。

我想告诉你的是,掌握Hibernate Fetch可能比你想象的要困难得多。当你轻松告诉我Hibernate Fetch很简单的时候,你就该多反思一下自己了。(只有一个例外,你是牛。)

嗯,引言里废话太多了。其实今天我只想先说一下Hibernate Fetch的功能。

众所周知,在Hibernate中,引入懒惰的概念是为了性能。在这里,我们以父母和孩子为模型来说明。

publicclassparentimplesserializable {/* * identifier field */privateongid;/* * persistent field */privatesticlds;//skippalgetter/settermethod } publicclasschildimplesserializable {/* * identifier field */privateongid;/* * persistent field */private net . foxlog . model . parentparent;////skipalgetter/settermethod } }当我们查询Parent对象时,默认情况下只有Parent的内容不包含子对象的信息。如果在Parent.hbm.xml中设置了lazy='false ',将同时获取所有相关的子内容。

问题是,如果我既想要Hibernate的默认性能,又想要暂时的灵活性,该怎么办?这是Fetch的功能。我们可以将fetch和lazy='true '之间的关系与事务中的编程事务和声明性事务进行比较,这并不准确,但它可能意味着这一点。

总的价值,fetch,是给你一个机会在代码级别采取主动。

parentparent=(Parent)hibernate template . execute(new hibernate callback(){ publicatobjectdoinhibernate(session ession)throwsHibernateException,SQLException { Queryq=session . createquery(nb

sp;                 "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去掉,就会报异常. 当然,如果lazy="false"就不需要fetch了有一个问题,使用Fetch会有重复记录的现象发生,我们可以理解为Fetch实际上不是为Parent服务的,而是为Child服务的.所以直接取Parent会有不匹配的问题.

参考一下下面的这篇文章 Hibernate集合初始化

update:以上有些结论错误,实际上在Hibernate3.2.1版本下测试,可以不出现重复记录,

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<list.size();i++){              Parent p = (Parent)list.get(i);              System.out.println("===parent = " + p);              System.out.println("===parent's child's length = " + p.getChilds().size());          }       }

打印结果如下:

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,如果非用的话因为有N+1的现象,所以可以结合batch模式来改善下性能.

以上是“Hibernate里的Fetch有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/137016.html

(0)

相关推荐

  • 美人鱼的画法,怎样区分人鱼线与马甲线

    技术美人鱼的画法,怎样区分人鱼线与马甲线首先对“马甲线”和“人鱼线”两个词解析下美人鱼的画法;马甲线:一般来讲,人的腹部肌肉分为腹肌和腹外肌,腹肌和腹外斜肌会形成一条竖着的线条,而这条线就是马甲线,左右腹肌和腹外肌组合起

    生活 2021年10月26日
  • php转十进制文本(php十六进制文本转十进制文本)

    技术php中2进制如何转文本流这篇文章主要介绍php中2进制如何转文本流,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! php 2进制转文本流的方法:1、创建一个PHP

    攻略 2021年12月15日
  • html中em是什么单位(em值是什么意思)

    技术css3中em指的是什么单位小编给大家分享一下css3中em指的是什么单位,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 在css3中,em是一个相对长度单位,相对于当前

    攻略 2021年12月19日
  • 土豆原产地,哪里产的土豆最好

    技术土豆原产地,哪里产的土豆最好好吃的土豆都是相似的,比如口感、食味以及安全性,不好吃的土豆各有各的不好吃土豆原产地。 以我个人的口感喜好以及市场的选择,薯界认为有四个产地的土豆最好。 定西种植的陇薯系列最好。日照充足,

    生活 2021年10月31日
  • 毅字五笔怎么打,毅日语怎么读,用拼音注音

    技术毅字五笔怎么打,毅日语怎么读,用拼音注音毅字读音:yì毅拼音:yì,注音:一ˋ,部首:殳部,部外笔画:11画,总笔画:15画五笔86:UEMC,五笔98:UEWC,仓颉:YOHNE,郑码:SUGQ四角:07247,结

    生活 2021年10月22日
  • 如何修改VB.NET支付宝接口

    技术如何修改VB.NET支付宝接口小编给大家分享一下如何修改VB.NET支付宝接口,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!曾经为没有VB

    攻略 2021年11月19日