今天在用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>