posts - 40,  comments - 187,  trackbacks - 0

开发环境:
Struts 1.2 + Spring 1.2.8 + Hibernate 3.2

遇到的问题:
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.zhjy.gea.module.affair.domain.Affair$$EnhancerByCGLIB$$e10be950.getAffairCatalogs(<generated>)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2049)
 at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1286)
 at org.apache.commons.beanutils.BeanUtilsBean.copyProperties(BeanUtilsBean.java:284)
 at org.apache.commons.beanutils.BeanUtils.copyProperties(BeanUtils.java:137)

分析原因:
由于Spring控制的Hibernate的生命周期只针对数据层和服务层,而未管理到表现层,所以会出现the owning Session was closed的现象。针对这一点,我通过hibernate filter的方式来解决。

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

<!--  hibernate session 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 > *.do </ url-pattern >
 
</ filter-mapping >


记于此处,望遇到同样问题的朋友,少走弯路。:)

                                                                    THE END
posted on 2007-07-23 18:31 小立飞刀 阅读(4321) 评论(3)  编辑  收藏 所属分类: Hibernate

FeedBack:
# re: Hibernate不听话了-- could not initialize proxy - the owning Session was closed
2007-07-24 15:14 | 一条老狗
另外,也可以在Service 或者 dao 层把lazy的Hibernate.initialize强制加载它。这样在视图层就不会出现session已关闭的错误了。
当然,这样似乎lazy就没有意义了。
视具体情况而定吧。

  回复  更多评论
  
# re: Hibernate不听话了-- could not initialize proxy - the owning Session was closed
2007-07-24 15:25 | 小雪飞刀
@一条老狗
您说的情况比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制。但是配置文件中Lazy属性是控制全局的。这时就需要用到Hibernate.initialize(Object proxy) 方法。
在配置文件里面可以用lazy=true,在程序里面可以用强制加载的方法Hibernate.initialize(Object proxy) 方法强制加载这样就相当于动态改变为lazy=false。
但有一点需要注意的是,proxy是持久对象的关联对象属性,如要把实体A的关联实体B也取出时,就要写Hibernate.initialize(a.b)。  回复  更多评论
  
# re: Hibernate不听话了-- could not initialize proxy - the owning Session was closed
2007-07-24 18:05 | 一条老狗
lazy 不是全局的,可以单个配置。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

生存或毁灭,这是个必答之问题:是否应默默的忍受坎苛命运之无情打击,还是应与深如大海之无涯苦难奋然为敌,并将其克服。此二抉择,究竟是哪个较崇高?

常用链接

留言簿(12)

随笔分类(43)

相册

收藏夹(7)

朋友的博客

电子资料

搜索

  •  

积分与排名

  • 积分 - 301042
  • 排名 - 192

最新评论

阅读排行榜

评论排行榜