Hibernate 異常org.hibernate.LazyInitializationException: could not initialize prox

Hibernate的Lazy初始化1:n關係時,必須保證是在同一個Session內部使用這個關係集合,不然Hiernate將拋出異常。
兩種處理方法:
一、這是延時加載的問題,把有關聯的所有pojo類,在hibernate.cfg.xml文件中。一般在many-to-one中,set標籤內中設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://justplayoop1.iteye.com/blog/1495888

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章