以前仔细研究过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条件对象加上一个去重的限制,具体代码为:
- 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"),来建立映射关系,不然会下面这个异常
- org.springframework.orm.hibernate3.HibernateQueryException:couldnotresolveproperty
假如:实体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高官谈Hibernate3.2新特性
hibernate一对一的关系hibernate一对一的关系hibernate一对一的关系hibernate一对一的关系hibernate一对一的关系hibernate一对一的关系
hibernate框架一对一测试案例,第四篇,使用于新手
hibernate一对一实例
Hibernate一对一,一对多,多对多实例
hibernate一对一外键关系,很适合入门者学习.
Hibernate双向一对一关联映射(注解版)
hibernate第一个hibernate
个人的很详细的Hibernate一对一映射配置详解,对初学者有帮助!
免积分的资源,希望可以帮到大家,这是我学习hibernate时候,自己写的代码。希望大家学业有成。
这是hibernate 的超级简单的例子,只有一个持久化对象和一个辅助类,还有一个测试类,对于初学者很有参考价值
Hibernate关于注解的一对多,多对多,一对一案例。。。。
加入了hibernate框架的javaWeb项目,里面包含了一对多的典型配置
hibernate外键实现一对一单向关联关系源码
Hibernate级联操作一对多demo Hibernate级联操作一对多demo Hibernate级联操作一对多demo
Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...
hibernate主键实现一对一单向关联关系源码
hibernate实例(一对多,多对一)hibernate实例(一对多,多对一)hibernate实例(一对多,多对一)
这里包含了hibernate多对一单向关联关系实现源码,希望对你有用。
hibernate one to one一对一关系示例,包括数据库备份文件。