SSH-ERROR:org.hibernate.LazyInitializationException: failed to lazily initialize
Posted on 2009-07-03 16:19 lubaolin 閱讀(2662) 評論(0) 編輯 收藏 所屬分類: javastruts2+spring2.x+hibernate3.x 懶加載異常:org.hibernate.LazyInitializationException: failed to lazily initialize
Hibernate的Lazy初始化1:n關系時,必須保證是在同一個Session內部使用這個關系集合,不然Hiernate將拋出異常:org.hibernate.LazyInitializationException: failed to lazily initialize of....
兩種處理方法:
一、設置lazy=false,此方法不再累述。
二、用OpenSessionInViewFilter過濾器,注意hibernateFilter過濾器和struts2過濾器在映射時的先后順序。同時要配置事物處理,否則會導致session處于只讀狀態而不能做修改、刪除的動作。
即在web.xml文件中如下配置:
<!-- Spring ApplicationContext配置文件的加載目錄。 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext.xml</param-value>
</context-param>
<!-- 解決延遲加載的問題 -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<!-- 繼承Struts2的FilterDispatcher類,具備GBK等編碼設定功能與struts2的action過濾功能。 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
com.iman.nrms.opm.web.common.FilterDispatcher
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Hibernate 允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限于同一個 Hibernate Session 范圍之內進行。如果 Service 層返回一個啟用了延遲加載功能的領域對象給 Web 層,當 Web 層訪問到那些需要延遲加載的數據時,由于加載領域對象的 Hibernate Session 已經關閉,這些導致延遲加載數據的訪問異常。而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是使每個請求過程綁定一個 Hibernate Session,即使最初的事務已經完成了,也可以在 Web 層進行延遲加載的操作。OpenSessionInViewFilter 過濾器將 Hibernate Session 綁定到請求線程中,它將自動被 Spring 的事務管理器探測到。所以 OpenSessionInViewFilter 適用于 Service 層使用HibernateTransactionManager 或 JtaTransactionManager 進行事務管理的環境,也可以用于非事務只讀的數據操作中。
request-->open session-->打開連接、開始事務-->持久操作-->渲染(關閉連接、session)-->response 其中一些過程省略了,不是很關心。
引自:http://blog.csdn.net/fhwbj/archive/2009/03/25/4022805.aspx