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)

相关推荐

  • 三明治的英语,我想要一个三明治用英语怎么说

    技术三明治的英语,我想要一个三明治用英语怎么说我想要一个三明治三明治的英语。I want a sandwich.Id like (to have) a sandwich = I would like (to have)

    生活 2021年10月25日
  • 外部css样式表的作用是什么

    技术外部css样式表的作用是什么本篇内容主要讲解“外部css样式表的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“外部css样式表的作用是什么”吧!

    攻略 2021年11月3日
  • 水浒传题目及答案100道,水浒传37回问题及答案

    技术水浒传题目及答案100道,水浒传37回问题及答案题目:宋江在船上准备跳下之时,被何人所救水浒传题目及答案100道?答:李俊李立。题目:镇上三霸有哪些?
    答:李俊和李立,张横和张顺,穆弘和穆春。
    题目:分析穆太公的形象

    生活 2021年10月25日
  • 生成JSON元数据对象的示例分析

    技术生成JSON元数据对象的示例分析生成JSON元数据对象的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。数据验证是生成 JSON应用程序中最富

    攻略 2021年11月25日
  • 数据之POD数据类型

    技术数据之POD数据类型 数据之POD数据类型1.POD数据类型的起源
    在C语言时代,只有基本数据类型char、int、float和复合数据类型数组、指针、结构体等。但是在C++时代,出现了抽象数据结构

    礼包 2021年12月9日
  • python发qq消息轰炸虐狗好友思路分析

    技术python发qq消息轰炸虐狗好友思路分析本篇内容介绍了“python发qq消息轰炸虐狗好友思路分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希

    攻略 2021年11月4日