今天搞了一上午,都在解决这个问题: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

问题:org.hibernate.LazyInitializationException: failed to lazily initialize的更多相关文章

  1. org.hibernate.LazyInitializationException: failed to lazily initialize

    今天搞了一上午,都在解决这个问题:org.hibernate.LazyInitializationException: failed to lazily initialize 原因很简单,是在非法的s ...

  2. hibernate延迟加载org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.javakc.hibernate.onetomany.entity.DeptEntity.emp, could not initialize proxy - no Session

    public static void main(String[] args) {  DeptEntity dept = getDept("402882e762ae888d0162ae888e ...

  3. ssh框架错误:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role。

    在做ssh项目练习的时候出现问题: org.hibernate.LazyInitializationException: failed to lazily initialize a collectio ...

  4. 使用hibernate从一方获取多方信息时报错:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

    引起原因:hibernate加载关联对象的方式有懒加载方式和立即加载方式. 如果在多对一的配置中没有指定加载方式,而一对多的配置中指定了懒加载方式,因此在获取一方是可获取到值,而获取多方时sessio ...

  5. 多对多关联懒加载导致failed to lazily initialize a collection of role: 实体类, could not initialize proxy - no Session 追加配置fetch = FetchType.EAGER解决

    一篇文章需要关联很多个标签,所以他们呈一对多(多对多)的关系 org.springframework.web.util.NestedServletException: Request processi ...

  6. Hibernate加载数据失败failed to lazily initialize a collection of role

    在测试获取数据库中的数据或者在页面获取时,有时会遇到这样的错误提示: failed to lazily initialize a collection of role: com.exam.entity ...

  7. 【转】hibernate懒加载的问题,failed to lazily initialize a collection of role

    hibernate懒加载的问题,failed to lazily initialize a collection of role hibernate懒加载的问题,failed to lazily in ...

  8. failed to lazily initialize a collection of role 异常

    最近在通过配置实体类的方式,正向自动扫描注解方式配置的hibernate类文件来生成数据库的方法搭建环境,遇到了许多问题. 通过数据库配置hibernate的时候,大家都知道是在实体类对应生成的.hb ...

  9. failed to lazily initialize a collection of role

    可能修复了一个重大的偶尔发生的几乎难以察觉的并且到现在我也没能理解的bug...有时(经常)调用updateNotNullfield方法(原理是从数据库中get一个对象,然后把原对象中非空的值赋予它, ...

随机推荐

  1. 做什么职业,也别做程序员,尤其是Java程序员

    千万别做程序员,尤其别做Java这种门槛低,入门快的程序员(别跟我说Java搞精通了也很牛之类的,原因不解释,做5年以上就知道了),程序员本来就是我见过最坑爹的职业了...Java程序员更是,现在满地 ...

  2. Buffer 和Cache 的区别

    Buffer 和Cache 的区别buffer 与cache 操作的对象就不一样.buffer

  3. Apache POI实现excel导出

    链接:http://poi.apache.org/ Excel数据导出步骤: 使用poi 完成账户数据的导出功能 导入poi  jar包并添加到classpath中 1.查询数据 2.定义导出头 St ...

  4. pandas中Loc vs. iloc vs. ix vs. at vs. iat?

    loc: only work on indexiloc: work on positionix: You can get data from dataframe without it being in ...

  5. ACC 001 C - Shorten Diameter 图论

    题目: Problem Statement Given an undirected tree, let the distance between vertices \(u\) and \(v\) be ...

  6. 使用自定义端口连接SQL Server 2008的方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例, ...

  7. python basestring()

    作用: basestring是str和unicode的超类(父类),也是抽象类,因此不能被调用和实例化,但可以被用来判断一个对象是否为str或者unicode的实例,isinstance(obj, b ...

  8. php 数组NULL元素的批量处理

    $a = array('a'=>1, 'b'=>0, 'c'=>NULL); foreach($a as $k=>$v) {  // if( is_null($a[$k]))  ...

  9. PHP获取汉字拼音首字母 截取中文字符串

    http://blog.csdn.net/everything1209/article/details/39005785 substr是按字符分割,而mb_strcut是按字节来分割,但是都不会产生半 ...

  10. pos机的热敏纸尺寸

    57x50或者是57x30,两个型号宽度都是一样的,只是厚度不一样,前者是厚一点,适合固定机用,后者适合移动POS机用 厚度不是指纸的厚度,而是纸的容量,移动机的纸槽较小只能用57X30的