现在的位置: 首页 > 综合 > 正文

hibernate延迟加载会出现的问题(failed to lazily initialize)

2014年01月30日 ⁄ 综合 ⁄ 共 1315字 ⁄ 字号 评论关闭

本文出自:http://blog.csdn.net/hongchangfirst 
  

 当我们用hibernate级联对象的时候,有时候为了效率和避免出现缓存问题,不是用eager,使用lazy延迟加载,但是会出现failed to lazily initialize... no session or session was closed 这种类似的错误。怎么解决呢?有两种办法:


1.设置lazy=false

如果是用annotation,则把fetch=FetchType.LAZY配置如下
fetch=FetchType.EAGER


将fetch类型设置成直接获取


2.就是使用filter,过滤所有的链接

如果在使用filter的时候,要配置事务处理,否则会导致session处于只读状态而不能做修改、删除的动作。

<web-app>

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<!--注意这里应该是你spring过滤的时候需要连接后台的过滤字符串-->
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>

 
如果你用的是maven工具进行构建,这时候会出来以下错误:严重: Exception starting filter hibernateFilterjava.lang.ClassNotFoundException: org.springframework.orm.hibernate.support.OpenSessionInViewFilter


这是因为缺少jar包所致,为什么呢?hibernate的核心包都用pom引入了啊?辗转反侧之后,终于找到了问题的所在,因为hibernate3和hibernate4的差异,所以我们在配置filter的时候要注明是hibernate3还是hibernate4,把上边的filter-class修改成如下即可:

<web-app>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<!--注意这里应该是你spring过滤的时候需要连接后台的过滤字符串-->
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>

好的,重新编译,ok了。

抱歉!评论已关闭.