浅谈解决Hibernate懒加载的4种方式
作者:最美的词 发布时间:2022-07-04 00:46:39
本文总结了我在学习hibernate的过程中,解决hibernate懒加载问题的四种方式。
所谓懒加载(lazy)就是延时加载,延迟加载。
什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载。
至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。
例如,有一个对象是Employee,还有一个对象是Department。显然,对于Employee相对Department来说,是多对一的关系;而对于Department相对Employee来说,是一对多的关系。当我们查询Employee对象的时候,如果希望通过employee对象的属性department查询到所对应的Department,那么是会抛出异常的。这是因为懒加载的存在,在session关闭之后,hibernate又向数据库发出一次请求,结果就抛出异常了。
下面总结的是解决这个问题的四种方式:
1.显式初始化(在查询方法内部)
要查询某员工属于哪个部门的时候,需要对Department进行预先查询
使用语句
Hibernate.initialize(Department.class);
2.修改对象关系文件,将lazy改写lazy=false,即关闭懒加载
以上两种方法,确实可以解决问题,但是缺点是无论后面是否使用该对象,hibernate都会向数据库发出SQL语句请求数据,造成不必要的性能浪费。
3.使用过滤器(web项目)
①获取session的方式必须使用getCurrentSession
②特殊的关闭session方式
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getCurrentSession();
tx = session.beginTransaction();
arg2.doFilter(request, response);//请求一直在走
tx.commit();
} catch (Exception e) {
// TODO: handle exception
if(tx != null){
tx.rollback();
}
}finally{
//特殊的关闭方式
HibernateUtil.closeCurrentSession();
}
}
4.在SSH框架中,使用spring提供的openSessionView
其原理和第三种方法中使用Filter类似,只不过这个filter是spring提供的。使用时只需要在web.xml文件配置如下:
<!-- 使用spring解决懒加载问题 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第3和第4中方法也能解决懒加载的问题,其中第4种方法也是目前使用较多的。但是这两种方法也是有缺点的,缺点就是延长了session关闭的时间,session的生命周期变长。没有使用该方法之前,session是在查询完数据之后,就被关闭了;而现在,session的关闭是在一次web请求的最后才关闭。
来源:http://blog.csdn.net/huhui_cs/article/details/8589977


猜你喜欢
- 问题:在web里面用iframe连接一个html文件 - html文件里面是超链接 -&nb
- PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启事务;PROPAGATION_REQUIRE
- 一、关于idea中Maven的位置idea自带一个maven,其路径大致如下C:/java/IntelliJ IDEA 2020.1/plu
- 本文实例为大家分享了Android高德地图marker自定义弹框窗口的具体代码,供大家参考,具体内容如下最终效果:1.gradle里添加高德
- Bezier曲线的形状是通过一组多边折线(特征多边形)的各顶点唯一地定义出来的。在这组顶点中:(1)只有第一个顶点和最后一个顶点在曲线上;(
- 前言上一篇我们认识了Kotlin编程语言,也搭建好开发环境。本篇就进入Kotlin的基础语法介绍,与其他编程语言一样,Kotlin也有自己的
- 在android提供了一种类型:Parcel。被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以外,只有实
- 以前传统的比较方式是遍历图片中的每一个像素,然后进行比对。这样的比对在少量图片的比对上虽然效率低一点,但是也没有什么不好。但是在大量图片比对
- Spring Boot如何实现配置文件的自动加载和刷新?在使用Spring Boot开发应用程序时,配置文件是非常重要的组成部分。在不同的环
- 在项目中我们肯定不能使用Spring自己生成的登录页面,而要用我们自己的登录页面,下面讲一下如何自定义登录页面,先看下配置<sec:h
- Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存。理论上Java中所有不会再被利用的对象所占
- 采用继承Thead类实现多线程:优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread(
- 目录概述LRU 的原理LRU 算法的实现LRU 算法描述LRU 算法代码实现方法一方法二方法三总结概述LRU 算法全称为 Least Rec
- 在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法,这
- 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消
- 本文实例为大家分享了java使用集合实现通讯录的具体代码,供大家参考,具体内容如下代码有些繁琐,只适合初学者。项目1java通讯录方法(声明
- 一、项目简述功能:宿舍管理员,最高管理员,学生三个身份,包括学 生管理,宿舍管理员管理,考勤管理,宿舍楼管理,缺勤 记录管理,个人信息修改等
- using System; using System.Collections.Generic; using System.Linq; usi
- 1、final修饰类被final修饰的类不能被继承,因此final类的成员方法也不能被覆写,被final关键字修饰的类没有子类,因此类的实现
- 1.用intellij idea 创建了一个springboot的项目,前期都运行的好好的,在ide中可以正常运行,但是打包成Jar运行却一