Hibernate中1+N问题以及解决方法
2016-05-05 13:38
585 查看
1. Hibernate中的1+N问题描述
在多对一关系中,当我们需要查询多的一方对应的表的记录时,可以用一条sql语句就能完成操作。然而,在多的一方的实体类中的@ManyToOne标注的fetch的默认值是fetchType.EAGER,这时,hibernate除了发出查询多的一方对应的表的记录的sql语句外,还会发出n(多方记录数)条sql语句,这就是1+n问题。如:bbs的板块(Category),主题(topic),回复(msg)。一个板块有多个主题,而一个主题属于一个板块,则Category和topic属于一对多的关系,在topic里设置@ManyToOne。当需要取出所有的主题时,只需要发出select* from topic一条语句就能做到。然而,hibernate会查询出每个topic所对应的Category,所以会发出1+n条sql语句。
2. 1+N问题的解决办法
①设置@ManyToOne的fetch属性值为fetchType.LAZY,这种方式解决后,后面的n条sql语句按需而发。但是有个弊端,就是如果需要级联查询就无法获取级联对象了。②设置@BatchSize(size=5)(该注解要加在类上面,跟@Entity在同一位置),这样发出的sql语句减少。这个设置在一定程度上提高了效率。
③在hqp语句中使用用join fetch,事实上Criteria用的就是这种方法。这也是最常用的方法;
@Test //join fetch publicvoid test1_N3(){ Session session=sf.getCurrentSession(); session.beginTransaction(); //List<Topic> topics=(List<Topic>)session.createCriteria(Topic.class).list();//只有一条查询语句,Criteria方法就是这种方式 List<Topic> topics=(List<Topic>)session.createQuery("from Topic t left join fetch t.category c").list(); for (Topic t:topics) { System.out.println(t.getId()+"----"+t.getTitle()); System.out.println(t.getCategory().getName()); } session.getTransaction().commit(); }这就是Hibernate中的1+N问题,如有错误之处,欢迎留言指正~
_____________________________________________________________________________________________________________________________________________________
-----乐于分享,共同进步!
-----更多文章请看:http://blog.csdn.net/eson_15
相关文章推荐
- 华为与乐视商业模式之争?
- UIAlertController中TextField的用法
- 《从业务新手到业务老手——游戏开发中CRUD框架的基本组成部分》
- 一些关于如何写更好的代码的建议
- 一个微信草根创业者的独白
- 小何讲Linux: Linux系统调用及用户编程接口(API)
- 动画篇(二)——android属性动画
- UIBezierPath和CAShapeLayer画各种图形
- 【VS开发】【DSP开发】如何使用WinDriver为PCIe采集卡装驱动
- android tabbar切换的实现
- Maven学习总结(二)——Maven项目构建过程练习
- expdp 中cluster=no的参数 导致ORA-31693 ORA-31617 ORA-19505 ORA-27037
- Spark性能优化指南——基础篇
- sql server 操作xml例子
- cf450B. Jzzhu and Sequences
- 常见的IE布局兼容问题
- [swift学习之三]枚举练习
- Mongodb 备份shell
- 【fastweixin框架教程4】AccessToken、QYAPIConfig管理
- java抽象类