您的位置:首页 > 编程语言 > Java开发

Hibernate懒加载异常理解和解决方案

2014-05-08 21:06 225 查看
         今天跟同事聊天聊到Hibernate的懒加载异常和1+N问题。一下子发现自己想不起来,一定是进了该公司之后很少实际做开发都是做研发的缘故。在博客上Mark下,以便以后查看。

这两个应该是java面试必问的问题,只可惜我是C/C++出身,学的东西又很杂,出道快一年了,总感觉自己技术没有很大进步,好了,废话不说了,我们来看看这两个问题。

懒加载异常:

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

懒加载异常解决方案:

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

1.直接不适用懒加载:lazy="false",这是相当XX的做法,如果确实需要懒加载,这显然是不能解决问题滴。

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的时候加上特定的配置,具体记不清了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate java
相关文章推荐