Hibernate中1+N问题以及解决方法
来源:互联网 发布:oracle认证 java 编辑:程序博客网 时间:2024/06/10 04:38
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();
- }
0 0
- Hibernate中1+N问题以及解决方法
- Hibernate中1+N问题以及解决方法
- Hibernate中1+N问题
- hibernate中1+n问题
- Hibernate的1+N(N+1)问题与解决方法
- Hibernate中N+1次select问题
- 解决Hibernate中1+n的问题
- 【Hibernate 6】常用的hql语句以及N+1问题
- Hibernate n+1问题
- hibernate N+1问题
- hibernate N+1问题
- Hibernate N+1 问题
- hibernate 1+N问题
- Hibernate n+1问题
- hibernate:1+N问题
- Hibernate N+1 问题
- Hibernate n+1问题
- Hibernate N+1 问题
- 当spfile文件中的参数修改错误,导致数据库无法启动问题
- 简单线段树模板
- HDU1159 Common Subsequence(最长公共子序列LCS)
- isstringstream——WOW!Amazing!
- c++ 异常处理(1)
- Hibernate中1+N问题以及解决方法
- 哈理工OJ 2305 Reversed Word(文字翻转stack)
- insmod: error inserting '***.ko': -1 Invalid parameters 真正原因以及解决方法
- 微信小程序-出现脚本错误或者未正确调用 Page()
- Oracle数据库动态注册和参数local_listener的使用
- box-shadow如何显示在它后面元素上面?
- Ubuntu网络配置——vlan+bonding
- 1.2 用两个队列实现一个栈
- java SLF4J 使用其他的 log框架