the owning Session was closed

 

 could not initialize proxy - the owning Session was closed

 

 

 

 

 

开发环境:
Struts 2 + Spring 2.0 + Hibernate 3.2

 

异常如下:

2009-3-21 17:59:05 org.hibernate.LazyInitializationException <init>
严重: could not initialize proxy - the owning Session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:60)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
	at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:172)
	at com.kindion.blog.ArticleType$$EnhancerByCGLIB$$40d67a28.toString(<generated>)
	at java.lang.String.valueOf(Unknown Source)
	at java.io.PrintStream.print(Unknown Source)
	at java.io.PrintStream.println(Unknown Source)
	at com.kindion.service.impl.ArticleServiceImplTest.testQueryAll(ArticleServiceImplTest.java:35)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:154)
	at junit.framework.TestCase.runBare(TestCase.java:127)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at junit.framework.TestSuite.runTest(TestSuite.java:208)
	at junit.framework.TestSuite.run(TestSuite.java:203)
	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

 

分析原因:
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个Session 范围之内进行。如果Service 层返回一个启用了延迟加载功能的领域对象给Web层,当Web层访问到那些需要延迟加载的数据时,由于加载领域对象的Session已经关闭,这些导致了延迟加载数据的访问异常!

 

Spring 为此提供了一个OpenSessionInViewFilter过滤器,它的主要功能是使每个请求过程绑定一个Session,即使最初的事务已经完成了,也可以在Web层进行延迟加载的操作。

解决方法:(经过查询相关资料,虽然找到这个解决办法,但是我的问题还是没有解决,在此帖出来,希望有人用得着)

在web.xml中配置filter来解决。

< filter > 
   < filter-name > hibernateFilter </ filter-name > 
   < filter-class >    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
   </ filter-class > 
 </ filter > 
 
 < filter-mapping > 
   < filter-name > hibernateFilter </ filter-name > 
   < url-pattern > *.action </ url-pattern > 
 </ filter-mapping > 

 

================================================================== 

 

我的问题解决了,我的问题出现在 web.xml 配置文件下 多个Filter 顺序 的问题

 
如果你有用到其他的过滤器(Filter),你就把OpenSessionInViewFilter这个过滤器放到你其他过滤器的前面。

<!--============SrpingOpenSessionInViewFilter============= -->
<!--把它放在其他Filter的前面-->
    <filter>
 <filter-name>hibernateFilter</filter-name>
 <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
 <filter-name>hibernateFilter</filter-name>
 <url-pattern>/*</url-pattern>
    </filter-mapping>
<!-- ============Sturts 2 Filter============= -->
    <filter>
 <filter-name>struts2</filter-name>
 <filter-class>
     org.apache.struts2.dispatcher.FilterDispatcher
 </filter-class>
    </filter>
    <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
    </filter-mapping>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值