hibernate 经验谈(一)

转载 2012年03月28日 23:07:13

转载于:http://blog.csdn.net/qq413041153/article/details/7350342

 

以前仔细研究过hibernate,现在随着项目接触,也慢慢的有所深入,下面将自己的一些新的体会发出来。


1.尽量少用one-to-many的映射,如果用请把lazy设置成true,这样在查询主表时所有关联的子表就不会查询了,更不会浪费数据库的资源。

2. 如果lazy="true"时,如果需要(用Criteria或者DetachedCriteria)查询子表对象,则会抛出一个session closed的异常,因为查询完主表对象hibernate的session就已经关闭了,所以是查询不到的,如果想要查询子表对象,请在one-to-many的设置属性fetch="join",这说明只要查询时就去抓取子对象,是hibernate的一种抓取策略。

3.如果lazy="true"并且fetch="join"时,用QBC进行分页查询,会带来新的问题,fetch="join"是采用左外连接查询的,所以主表的数据就会出现很多重复记录,这时需在QBC条件对象加上一个去重的限制,具体代码为:

  1. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

换句话说fetch是为子对象服务的,不适合主对象的查询操作.

4. 如果用HQL查询则一切正常,不用加去重操作,子对象也可以查询出来.

5. 如果lazy="false"时,并没有设置fetch属性,用HQL查询也会抛出一个sessin closed 异常,所以需要在HQL写上抓取子对象的关键字,例如:from main join fetch main.detail as detail,这样在获取子对象属性时就关采取抓取策略.

6. 在使用DetachedCriteria拼凑查询条件的时候,如何条件涉及到子对象的属性时,需要用DetachedCriteria.createAlias("b","b"),来建立映射关系,不然会下面这个异常

  1. org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property

假如:实体A中包含set<B>

那么在DetachedCriteria 中拼凑查询条件时,如果条件是B中的某个属性Bp1的话,那么应该通过createAlias()创建 实体A于B的关联,例:criteria.createAlias("B", "B"),那么你在添加B的查询条件的时候,add(Restrictions.eq("B.Bp1","test"));
时才不会报错,不然会报找不到属性B.Bp1,当然在设置了关联之后还会引发一个问题也就是上面提到的重复问题,因为设置关联之后hibernate是使用左外连接拼接的sql,这里的解决方案就是也需要加上上面提到的去除重复数据的代码即可.
当然添加实体之间的关联之后,会把B也加载出来,就算设置了延迟加载也没用。
说所以说为了性能 在拼凑查询条件的时候能不设置关联就不关联。

hibernate 经验谈(一)

以前仔细研究过hibernate,现在随着项目接触,也慢慢的有所深入,下面将自己的一些新的体会发出来。     1.尽量少用one-to-many的映射,如果用请把lazy设置成true,这...
  • qq413041153
  • qq413041153
  • 2012年03月24日 09:43
  • 8069

hibernate经验谈

1。设计Object时的属性时,对于一些数字,要用对象类型,不要用基本类型,比如用Long,不要用long,否则如果插入记录时,此属性为空时,数据库中会自动添加默认值02。自身的“一对多”和“多对一”...
  • soleghost
  • soleghost
  • 2005年06月15日 13:50
  • 836

hibernate 经验谈

 1、建立数据库的时候最好建立一个跟业务逻辑完全没有关系的id,这样的好处就是以后当数据量大的时候可以容易的建立索引,而且当业务逻辑变化的时候底层的数据结构不用变化很大。2、代码的干净是非常非常的重要...
  • nsrainbow
  • nsrainbow
  • 2008年04月08日 23:32
  • 878

如何实现复杂FPGA设计的时序收敛

“打鼹鼠”是一个古老(电子时代之前)的休闲游戏。在桌面上有许多洞,每个洞里都藏着鼹鼠。当有鼹鼠从洞里钻出来时,你就用锤子打它,让鼹鼠退回洞里,你因此而得分。当鼹鼠返回洞里时,又有一只鼹鼠会随机地从另外...
  • flyingforever_wl
  • flyingforever_wl
  • 2011年11月29日 08:46
  • 872

打架经验谈

据我的观察总结,人一过个二十六岁就难得再有机会打架了。我个人认为没有打过架的男性人生是不完整的人生,想把看着不顺眼的人打倒在地然后踏上一万只脚这个冲动简直是胎里带来的。我上中学的时候虽然已经开化很多,...
  • h9s
  • h9s
  • 2004年07月16日 16:16
  • 759

hibernate 经验谈2

hibernate虽然对多种数据库进行了适应,以达到前台感受不到后台的数据库类型 ,但是在 Blob 和 Clob 这两种类型的存取方面不同的数据库有不同的实现方法,这方面 hibernate   就...
  • nsrainbow
  • nsrainbow
  • 2008年04月09日 00:08
  • 761

hibernate自动建表出现的问题

报错信息是: 21:36:15,606 ERROR SchemaUpdate:212 - Unsuccessful: create table tb_articles (id big...
  • qq_28483283
  • qq_28483283
  • 2016年03月18日 21:43
  • 450

hibernate的二级缓存 实际例子

1.实体映射文件:                          
  • elfenliedef
  • elfenliedef
  • 2011年03月11日 11:22
  • 465

打架经验谈(转贴)

据我的观察总结,人一过个二十六岁就难得再有机会打架了。我个人认为没有打过架的男性人生是不完整的人生,想把看着不顺眼的人打倒在地然后踏上一万只脚这个冲动简直是胎里带来的。我上中学的时候虽然已经开化很多,...
  • coofucoo
  • coofucoo
  • 2004年12月07日 21:59
  • 1603

hibernate中两个实体类与同一张数据表进行映射后出现的问题解决

        最近项目中遇到了一个子系统需要整合到它的父系统的问题,由于父系统和子系统的工程比较庞大 ,涉及到的class也是相当的多。最后不得已将其中比较关键的class对应的数据表进行了统一。那...
  • dmm1982
  • dmm1982
  • 2008年04月11日 12:32
  • 2076
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate 经验谈(一)
举报原因:
原因补充:

(最多只允许输入30个字)