懒加载异常处理

本文探讨了Hibernate中的懒加载异常和1+N问题。懒加载是Hibernate的一种优化策略,但在某些情况下可能导致懒加载异常。文章详细解释了懒加载的概念、分类以及异常产生的原因,并提供了几种解决方案,如设置`lazy="false"`、使用`OpenSessionInViewFilter`、`HibernateInterceptor`,以及调整HQL查询。此外,还特别提到了在Struts2环境下处理懒加载异常的方法。
摘要由CSDN通过智能技术生成

今天聊到Hibernate的懒加载异常和1+N问题。这两个应该是java面试必问的问题,好了,废话不说了,我们来看看这两个问题。

什么是懒加载?
答:在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。
我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。

懒加载的作用:性能优化:
分类:
1、类得懒加载
2、集合的懒加载
3、单端关联的懒加载(多对一)

![这里写图片描述](https://img-blog.csdn.net/20151213155704143)        

懒加载
1、类的懒加载
1、利用session.load方法可以产生代理对象
2、在session.load方法执行的时候并不发出sql语句
3、在得到其一般属性的时候发出sql语句
4、只针对一般属性有效,针对标示符属性是无效的
5、默认情况就是懒加载
2、集合的懒加载
false 当session.get时,集合就被加载出来了
true 在遍历集合的时候才加载
extra
针对集合做count,min,max,sum等操作
3、单端关联的懒加载(多对一)

<class name="com.test.Student"table="student" lazy="true">  
这种方式等价于  
<class name="com.test.Student"table="student" proxy="com.test.Student">  

懒加载异常:

Hibernate框架的作用就是让代码和数据库都以面向对象的存在方式联系起来,从数据库取出数据并通过Hibernate转化成内存中的对象A,我们都知道对象的成员也有可能是另一个类的实例(另一个类的对象B),而这个成员对象B在数据库中也有自己对应的数据。很多时候我们取出的对象A其实并不需要B对象做业务,如果全部取出无疑是造成性能的浪费,因此在开发中我们常常把A对象的装载,也就是从数据库里取数据并转化成A对象的过程定义为懒加载,顾名思义,懒加载的意思就是取数据的时候不取成员对象B所对应的数据。在需要用到B的时候再从数据库中取对象。另外我们要知道一点从数据库里取数据是通过session去取的,如果当你的程序准备加载B对象的时候,发现session关闭了或者过期了便会产生懒加载异常。

懒加载异常解决方案:

在网上找的解决方案,仅供参考,思路是正确的

1.直接不适用懒加载:lazy=”false”,这是相当一般的做法(但是在实际的开发中一般不可取),如果确实需要懒加载,这显然是不能解决问题滴。

2.OpenSessionInViewFilter或者OpenSessionInViewInterceptor,正如名字所示,这是解决在view层里调用dao层的出现的懒加载问题的方法。其目的是给web request提供单一的hibernate session,但是它也只能给web request提供hibernate session。它会过滤所有指定的web request,并提供持续的session连接。

3.HibernateInterceptor 如果有某一个hibernate请求不是经由web request发起的,而是由quartz这样的定时任务发起的,那么quartz怎么样才能得到hibernate session呢?解决办法就是使用HibernateInterceptor。也就是说不是通过控制(过滤)web请求来实现。

4.另外还有一种就是你需要用懒加载从数据库加载某对象在发HQL的时候加上特定的配置

struts2+spring+hibernate 懒加载异常:org.hibernate.LazyInitializationException: failed to lazily initialize

Hibernate的Lazy初始化1:n关系时,必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出异常:org.hibernate.LazyInitializationException: failed to lazily initialize of….

这种异常有时是因为在用Hibernate的load方法取数据库的数据时发生的,因此往往load出来的对象是一个Proxy即一个代理对象,而取出来的方法执行完毕后,session就会关闭,而当返回这个代理对象到客户端解析jsp页面时才会真正的发SQL语句,而此时的session已经关闭,因此会抛出此异常。

解决方法如下:
(1)使用get方法来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值