今天在用Hibernate延迟加载时,显示到界面出现如下问题:
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
原因: 在界面加载数据时, session已经关闭,故报此错. 此前的对象只是代理对象(只有ID值)
故使用Spring 里的 OpenSessionInViewFilter 来解决此问题
在web.xml里配置
- <!--Hibernate Open Session in View 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 >
再测试, 问题依然存在,,, 纳闷....... 后来分析,再google... 终于发现问题出在Struts2上....
现在的web.xml里,我是把OpenSessionInViewFilter的配置放在Struts2后面的.
我更改下前后顺序 , 神奇的解决了:) 正确的配置顺序如下:
- <!--Hibernate Open Session in View Filter 注意要放在Struts2配置前面-->
- < 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 >
- < 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 >