1. 程式人生 > >解決no session or session was closed的問題

解決no session or session was closed的問題

Spring為我們解決Hibernate的Session的關閉與開啟問題。 
Hibernate 允許對關聯物件、屬性進行延遲載入,但是必須保證延遲載入的操作限於同一個 Hibernate Session 範圍之內進行。如果 Service 層返回一個啟用了延遲載入功能的領域物件給 Web 層,當 Web 層訪問到那些需要延遲載入的資料時,由於載入領域物件的 Hibernate Session 已經關閉,這些導致延遲載入資料的訪問異常

(eg: org.hibernate.LazyInitializationException:(LazyInitializationException.java:42) 
 - failed to lazily initialize a collection of role: cn.easyjava.bean.product.ProductType.childtypes, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cn.easyjava.bean.product.ProductType.childtypes, no session or session was closed)。

這裡不提倡在*.hbm.xml中關閉lazy。

用來把一個Hibernate Session和一次完整的請求過程對應的執行緒相繫結。目的是為了實現"Open Session in View"的模式。例如: 它允許在事務提交之後延遲載入顯示所需要的物件。


而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是用來把一個Hibernate Session和一次完整的請求過程對應的執行緒相繫結。目的是為了實現"Open Session in View"的模式。例如: 它允許在事務提交之後延遲載入顯示所需要的物件。
 OpenSessionInViewFilter 過濾器將 Hibernate Session 繫結到請求執行緒中,它將自動被 Spring 的事務管理器探測到。所以 OpenSessionInViewFilter 適用於 Service 層使用HibernateTransactionManager 或 JtaTransactionManager 進行事務管理的環境,也可以用於非事務只讀的資料操作中。

<filter>
        <filter-name>Spring OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
     <init-param>
    
<!-- 
指定org.springframework.orm.hibernate3.LocalSessionFactoryBean在spring配置檔案中的名稱,預設值為sessionFactory
     如果LocalSessionFactoryBean在spring中的名稱不是sessionFactory,該引數一定要指定,否則會出現找不到sessionFactory的例外
-->
     <param-name>sessionFactoryBean</param-name>
   <param-value>sessionFactory</param-value>
  </init-param> 
    </filter>
    <filter-mapping>
        <filter-name>Spring OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>