zoukankan      html  css  js  c++  java
  • 问题:org.hibernate.LazyInitializationException: failed to lazily initialize

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

  • 相关阅读:
    arangodb安装
    ubuntu安装java方法
    设置代理
    自动机
    统计学习基本理论知识(一)
    条件随机场(四)
    条件随机场(三)
    hive安装
    GC root & 使用MAT分析java堆
    jinfo介绍
  • 原文地址:https://www.cnblogs.com/keyi/p/6422918.html
Copyright © 2011-2022 走看看