浅谈解决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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 前言今天刚买了一台服务器,上面什么都没有,正好可以出一期 Linux 上配置java环境的教程可以看到我这个服务器上面是没有配置过 java
- 我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现。先来看最简单的—实现的功能是,将一个字符串变成图片写入到文件中实现代码
- 我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { &n
- 一、文件上传原理 1、文件上传的前提:a、form表单的method必须是postb、form表单的enctype必须是multi
- 环境:apache-tomcat-8.5.15jdk1.8.0_172IDEA建立一个maven-webapp项目:Create New P
- 一、概要1.Java虚拟机(Jvm)是什么?2.Java虚拟机是用来干什么的?3.Java虚拟机它的体系结构是什么样子的?4.Java虚拟机
- namespace ConsoleTest{ class Program  
- 网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。package day05; import java.io.Buffered
- 传值就是将实参的值传到所调用的函数里面,实参的值并没有发生变化,默认传值的有int型,浮点型,bo
- 基本介绍数据回显:模型数据导向视图(模型数据 ---> Controller ---> 视图)说明:SpringMVC在调用方法
- 目录顶级语句弃元参数仅初始化设置器 (Init only setters)记录类型 (Record)模式匹配增强Type patterns
- 实例描述现有某班学生的两份成绩,两份成绩中存在一些不一致的记录。需借助于编程方法找出这些不一致的记录。实例代码using System;us
- 前言:本文主要讲解以c语言编写猜数字游戏,目的是介绍C语言中的循环和分支的具体用法。一:猜数字游戏基本介绍&对程序预期.猜数字游戏,
- SpringBoot默认使用HikariDataSource数据源定义数据源:存储了所有建立数据库连接的信息。通过提供正确的数据源名称,你可
- 有些人可能对线程池比较陌生,并且更不熟悉线程池的工作原理。所以他们在使用线程的时候,多数情况下都是new Thread来实现多线程。但是,往
- 1.封装什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问。此时就要提到一个关键字
- 目录一、二叉树的顺序存储1.堆的存储方式2.下标关系二、堆(heap)1.概念2.大/小 根堆2.1小根堆2.2大根堆3.建堆操作3.1向下
- 1、@Valid与@Validated的区别1.1 基本区别@Valid:Hibernate validation校验机制@Validate
- 实际开发中订单往往都包含着订单状态,用户每进行一次操作都要切换对应的状态,而每次切换判断当前的状态是必须的,就不可避免的引入一系列判断语句,
- 摘要本文主要讲解mall通过整合SpringSecurity和JWT实现后台用户的登录和授权功能,同时改造Swagger-UI的配置使其可以