web.xml中配置Spring的OpenSessionInViewFilter的作用

    Hibernate 允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限於同一個 Hibernate Session 範圍之內進行。如果 Service 層返回一個啓用了延遲加載功能的領域對象給 Web 層,當 Web 層訪問到那些需要延遲加載的數據時,由於加載領域對象的 Hibernate Session 已經關閉,這些導致延遲加載數據的訪問異常。而Spring爲我們提供的OpenSessionInViewFilter過濾器爲我們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是使每個請求過程綁定一個 Hibernate Session,即使最初的事務已經完成了,也可以在 Web 層進行延遲加載的操作。OpenSessionInViewFilter 過濾器將 Hibernate Session 綁定到請求線程中,它將自動被 Spring 的事務管理器探測到。所以 OpenSessionInViewFilter 適用於 Service 層使用HibernateTransactionManager 或 JtaTransactionManager 進行事務管理的環境,也可以用於非事務只讀的數據操作中。 
    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>
  </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>
 

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