no session or session was closed

        學過Hibernate的都知道,Hibernate的延遲加載功能效率槓槓的,但是也會容易造成下面的異常:

failed to lazily initialize a collection of **********,no session or session was closed

       默認情況下,開啓一個事務,就會打開session,結束一個事務後,session就會關閉,意思就是說默認情況下session是在事務中打開的。
一般的項目事務都是配置在service方法,就是運行一個service方法的時候,就會首先開啓事務,然後運行該方法,然後關閉事務。所以要是在jsp中或者沒有配置事務,而在session關閉的情況下,就很容易出現問題了。

   

解決方法:
        
在web.xml中:

<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>


懶加載解決方案:
對於Session的 load和get方法, load有懶加載,get沒有懶加載

對於 兩個對象有聯繫關係時,通過獲取 Student,並得到 Classes 此時,classess就是懶加載的,在session關閉之後,操作 classess對象是會報錯的,解決方案如下:
(1)在 .hbm.xml中 設置 lazy=false
(2)在session關閉之前,調用一下獲取 clasess的屬性,調用屬性,此時classes類就不是懶加載了

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