问题:org.hibernate.LazyInitializationException: failed to lazily initialize

简介: 今天搞了一上午,都在解决这个问题:org.hibernate.LazyInitializationException: failed to lazily initialize原因很简单,是在非法的session中去调用lazy=“true“的属性,网上资料蛮多的,解决方法有两个1,把lazy=”false“2,在web.

今天搞了一上午,都在解决这个问题:org.hibernate.LazyInitializationException: failed to lazily initialize

原因很简单,是在非法的session中去调用lazy=“true“的属性,

网上资料蛮多的,解决方法有两个

1,把lazy=”false“

2,在web.xml中加入:(在structs的过滤器之前)

复制代码
<filter>
<filter-name>hibernateFilter</filter-name> <filter-class> org.springframework.orm.hibernate.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <!-- 加入上面这些 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 
复制代码

第一种方法,就是设置为不要用lazy加载元素,这样做,虽然可以解决上面这个问题,但是会产生一些不必要的开销。比较复杂的对象对应关系,或者数据量比较大的时候,不推荐这么做
第二种方法,就是避免session关闭过早导致出现这样的异常,这样的方法以前也是使用过,而且一般情况下filter过滤链接都会做。

 

但是以上这两种方法,在解决小规模的数据时 ,还凑活能用,但是在大量数据时 ,就会产生大量的耗时。

下面说说,我遇到的问题吧,先说前提:

有员工Staff和所在部门Group两个对象,他们是many-to-many的关系,一个员工可以在多个部门中(比如,甲可以是销售部门的,也可以同时是人事部门的);一个小组里面有多个员工,如果采用上面两种解法,就会导致下面这样的事情发生:

当我在查询 Staff 甲 时,会再查询 甲所在的部门A,B,C,D,因为之前设置的两种方法,会在我们实例化一个对象的时候,将其中lazy加载的所有元素都实例化,也就是会造成,系统会去实例化A,B,C,D部门下的所有员工,这些员工又在别的一些部门中,依次直至所有的对象都被实例化出来,导致相当的耗时。

(不要问我为什么知道,说多了,都是泪啊!!)

 

最后经过排查,发现是因为两句log ,也就是我在获取对象后,用了一句

System.out.println("staff="+staff);

当系统执行这么一句的时候,是会去实例化staff对象里面的所有元素,但是因为staff里面的group是lazy加载的,所以,此时才会出现之前提到过的这个exception.

所以,记住,有lazy加载的对象时,千万不能用=这个操作,不然必报这个exception

目录
相关文章
|
Java Spring 数据库连接
hibernate 延迟加载的错误 failed to lazily initialize a collection of role
这个问题一般出现在一对多的情况下,解决的方法有两种1、设置lazy=false如果是用annotation,则配置如下@OneToMany(   targetEntity = CourseAuthorizationItem.class,   cascade = {CascadeType.PERSIST, CascadeType.MERGE},   mappedBy = "course",
2149 0
|
27天前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
15天前
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
|
24天前
|
SQL Java 关系型数据库
数据库访问:什么是Hibernate框架?
【4月更文挑战第15天】Hibernate是开源ORM框架,将Java对象与数据库表映射,简化对象-关系映射,提升开发效率和性能。它自动化处理数据操作,支持多种数据库,自动生成SQL,提供配置选项和高级特性,减少手动SQL编写,便于切换数据库。
25 2
|
10月前
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
130 0
|
8月前
|
Java 数据库连接
简述使用Hibernate框架的几个步骤
简述使用Hibernate框架的几个步骤
40 0
|
9月前
|
SQL Java 关系型数据库
Hibernate框架概述
Hibernate框架概述
80 0
|
10月前
|
SQL 缓存 Oracle
Hibernate框架【一】——HIbernate框架介绍
Hibernate框架【一】——HIbernate框架介绍
176 0
|
10月前
|
SQL XML Java
Hibernate框架【四】——基本映射——多对一和一对多映射
Hibernate框架【四】——基本映射——多对一和一对多映射
106 0
|
10月前
|
XML 存储 Java
Hibernate框架【三】——基本映射——一对一映射
Hibernate框架【三】——基本映射——一对一映射
48 0