hibernate中的sql 1+n 问题
(
产生的原因:当一对多或多对多的映射关系下,当在一方添加或修改数据时,一方集合属性中的多方都要发生变化;先select语句,再update语句.当一方集合属性中的数据有很多时,对应的update语句就有很多.
解决方案:
1.在集合配置上加inverse=”true”.表示一方放弃维护外键关系,但不会影响查询,这样不管一方怎么变化,都不会影响多方.
2.在set标签中添加lazy=”true”,目的就是当需要多方数据时才去查询.lazy属性放在class标签后表示跟load方法有关.
)
/**
* Query接口的list()方法不会从Session缓存中读取数据,这样导致效率比较低
*/
@Test
public void testFindAll_list() {
// 1.获取Session对象
Session session = HbnUtils.getSession();
try {
// 2.开启事务
session.beginTransaction();
// 3.执行操作
//第一次查询
String hql = "from Student";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//第二次查询
List<Student> list2 = session.createQuery(hql).list();//这里还是从数据库读取的数据
for (Student student : list2) {
System.out.println(student);
}
// 4.事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
// 5.事务回滚
session.getTransaction().rollback();
}
}
/**
* Query接口的iterate()方法会从Session缓存中读取数据
*/
@Test
public void testFindAll_iterate() {
// 1.获取Session对象
Session session = HbnUtils.getSession();
try {
// 2.开启事务
session.beginTransaction();
// 3.执行操作
//第一次查询
String hql = "from Student";
//Iterator it = session.createQuery(hql).iterate();//n+1问题就是由iterate引起的
//while(it.hasNext()){
// System.out.println(it.next());
// }
//避免n+1问题 :第一次查询使用list()而不是iterate()
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
System.out.println("------------");
//第二次查询
Iterator it2 = session.createQuery(hql).iterate();
while(it2.hasNext()){
System.out.println(it2.next());
}
// 4.事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
// 5.事务回滚
session.getTransaction().rollback();
}
}
hibernate中的sql 1+n 问题的更多相关文章
- hibernate中使用sql语句进行表链接查询,对结果集的遍历方法
今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_ ...
- 使用SQLQuery 在Hibernate中使用sql语句
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.下面来描述如何使用这个API进行查询. 1.标量查询(Scalar q ...
- hibernate中的sql语句
hibernate的hql查询语句总结 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Stud ...
- 在hibernate中使用SQL语句
- JavaWeb_(Hibernate框架)Hibernate中数据查询语句SQL基本用法
本文展示三种在Hibernate中使用SQL语句进行数据查询基本用法 1.基本查询 2.条件查询 3.分页查询 package com.Gary.dao; import java.util.List; ...
- hibernate在使用sql查询query自动转化成model类型数据,query.addEntity
hibernate使用自动的hql查询或者其封装的查询方法都能字段转化成对象 而如果在hibernate中使用sql时大多返回为Object[]对象 那么如何将object[]转换成model呢,答案 ...
- hibernate 5原生sql查询测试学习代码
基本查询 import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org. ...
- JDBC与Hibernate中SQL语句参数设置的顺序问题
JDBC中:设置从1开始 例: Connection con = DriverManager.getConnection("jdbc:mysql://localhost/...", ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- scrapy框架之分布式操作
分布式概念 分布式爬虫: 1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取. 2.原生的scrapy是不可以实现分布式爬虫? a)调度器无法共享 b)管道无法共享 3.scrapy- ...
- Java——word分词·自定义词库
word: https://github.com/ysc/word word-1.3.1.jar 需要JDK8word-1.2.jar c语言给解析成了“语言”,自定义词库必须为UTF-8 程序一旦运 ...
- git push declined due to email privacy restrictions 解决方法
push declined due to email privacy restrictions 今天push的时候发现了这个问题无法push 解决: 进入github主页==>setting = ...
- 安全测试8_Web安全实战2(暴力破解)
1.暴力破解的概念 顾名思义,暴力破解的原理就是使用攻击者自己的用户名和密码字典,一个一个去枚举,尝试是否能够登录.因为理论上来说,只要字典足够庞大,枚举总是能够成功的! 2.暴力破解的实战 在有了之 ...
- LeetCode 4. Median of Two Sorted Arrays & 归并排序
Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...
- vmware虚拟网络
VMware 虚拟网络 1.1. 虚拟网卡.虚拟交换机当使用 VMware Workstation 安装一个虚拟机时就会自动安装一块虚拟网此外还可手动给虚拟机添加多块虚拟网卡.交换机用于电(光)信号的 ...
- hadoop的块
http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html http://www.cnblogs.com/cloudma/articles/had ...
- js五子棋游戏
//code <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- HTTP(搁置)
HTTP请求 响应报头内容 Connection:keep-alive #当浏览器与服务器通信时对于长连接如何进行处理:close/keep-alive Content-Encoding:gzip # ...
- MVC基于角色权限控制--权限过滤
用户访问服务器实际上就是访问控制器下的方法,因此在权限控制就是控制器方法的访问权限 为了方便控制,我们可以建立一个基类控制器(BaseController),让需要的控制器继承这个控制器即可,在Bas ...