天天看點

org.hibernate.LazyInitializationException: could not initialize proxy - no Sessi

錯誤頁面提示

could not initialize proxy - no Session

控制台

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

病症:這是一個lazy使用後的Exception,使用遲時加載,在session(hibernate裡的session),關閉後使用該對象的未加載變量,也就是說session已經關閉,沒有儲存到記憶體中,然後你使用了,導緻該異常。

原因 :

      在hibernate中:hibernate3 預設支援延遲加載(lazy="proxy"我們可以把proxy看作是true),hibernate2 預設立即加載 (lazy="false")。

      在hibernate3中,所有的實體設定檔案(user.hbm.xml)中的lazy屬性都被預設設成了true,就是當這個類沒有被調用時,延時加載,導緻了以上情況的發生,在配置檔案中将lzay屬性設為false就可以了。

兩種處理方法:

一、這是延時加載的問題,把有關聯的所有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>