(

产生的原因:当一对多或多对多的映射关系下,当在一方添加或修改数据时,一方集合属性中的多方都要发生变化;先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 问题的更多相关文章

  1. hibernate中使用sql语句进行表链接查询,对结果集的遍历方法

    今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_ ...

  2. 使用SQLQuery 在Hibernate中使用sql语句

    对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.下面来描述如何使用这个API进行查询. 1.标量查询(Scalar q ...

  3. hibernate中的sql语句

    hibernate的hql查询语句总结   在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Stud ...

  4. 在hibernate中使用SQL语句

  5. JavaWeb_(Hibernate框架)Hibernate中数据查询语句SQL基本用法

    本文展示三种在Hibernate中使用SQL语句进行数据查询基本用法 1.基本查询 2.条件查询 3.分页查询 package com.Gary.dao; import java.util.List; ...

  6. hibernate在使用sql查询query自动转化成model类型数据,query.addEntity

    hibernate使用自动的hql查询或者其封装的查询方法都能字段转化成对象 而如果在hibernate中使用sql时大多返回为Object[]对象 那么如何将object[]转换成model呢,答案 ...

  7. hibernate 5原生sql查询测试学习代码

    基本查询 import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org. ...

  8. JDBC与Hibernate中SQL语句参数设置的顺序问题

    JDBC中:设置从1开始 例: Connection con = DriverManager.getConnection("jdbc:mysql://localhost/...", ...

  9. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 网络基础和python(二)

    一,五层协议 应用层    端口 传输层   tcp\udp 网络层   ipv4\6 数据链路层  ethernet 物理层    mac 二:什么是变量? 变量:核心在于变和量儿字,变->变 ...

  2. FastDFS+Nginx+fastdfs-nginx-module集群搭建

    一.实验环境说明 操作系统: Centos 6.6 x64 FastDFS 相关版本: fastdfs-5.05 fastdfs-nginx-module-v1.16 libfastcommon-v1 ...

  3. three.js学习:初学three.js,从立方体开始

    目前three.js是浏览器展现3D效果的一个很强大的js工具,遗憾的是没有特别系统而全面的文档(threejs官方文档感觉有些缺漏,可以和WebGL中文网的threejs教程对比着看).好了,根据W ...

  4. linux:ubuntu安装mysql(一)

    1.下载MySQL安装包(MySQL Community Server) 地址:https://dev.mysql.com/downloads/mysql/ 2.解压 tar -xvf mysql-s ...

  5. 【Selenium-WebDriver自学】Selenium-IDE模式匹配(六)

    ==================================================================================================== ...

  6. javafx链接实现

    方式一: Desktop.getDesktop().browse(new URI(manualUrl)); 在linux环境bug 方式二: 转载自:https://stackoverflow.com ...

  7. SpringMVC源码学习之request处理流程

    目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的. 建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理 ...

  8. window.location.search的用法 和 地址栏的的javsscript编码与解码

    ocation.search是从当前URL的?号开始的字符串 如:http://www.51js.com/viewthread.php?tid=22720 它的search就是?tid=22720 e ...

  9. [转]USB之Part 4 - Protocol

    原地址http://www.usbmadesimple.co.uk/ums_4.htm Controlling a Device Before we go into detail, we need t ...

  10. 配置阿里云的金融云上的rsync

    论坛里看到易淘发的教程, 转载过来