天天看點

【JAVA】No Session found for current thread

o如果你的項目用spring3+hibernate4+struts2建構的web項目,或許你也碰到了在執行資料庫操作時出現:

org.hibernate.HibernateException: No Session found for current thread
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:)
           

這樣的錯誤,或者saveOrUpdate明明執行了卻沒有更新修改!!!你以為是沒有配置current_session_context.class為thread?也不是!

作為java web的菜鳥,雖然寫了一年的代碼了,但是這個問題,讓我郁悶許久,以前碰到了,都讓我忽略了,這次做的一個項目,竟然還碰到了,讓我難以容忍,在各種百度搜尋之後,終于,讓真相浮出水面。

最終解決辦法在web.xml配置openSessionInViewFilter這個過濾器就可以了,web.xml增加如下:

<!-- openSessionInViewFilter -->
   <filter>
         <filter-name>openSessionInViewFilter</filter-name> 
         <filter-class> 
         org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
         </filter-class> 
         <!-- 指定在spring配置的sessionFactory(預設名為sessionfactory)-->
        <init-param> 
            <param-name>sessionFactoryBeanName</param-name> 
            <param-value>sessionFactory</param-value> 
        </init-param> 
             <!-- singleSession預設為true,若設為false則等于沒用OpenSessionInView -->   
        <init-param> 
         <param-name>singleSession</param-name> 
        <param-value>true</param-value> 
        </init-param> 
    </filter>
    ········
    <filter-mapping>
       <filter-name>openSessionInViewFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
           

為什麼這樣就可以解決問題了呢?請檢視spring3文檔:http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/orm/hibernate4/support/OpenSessionInViewFilter.html

其中寫到:

This filter makes Hibernate Sessions available via the current thread, which will be autodetected by transaction managers. It is suitable for service layer transactions via HibernateTransactionManager as well as for non-transactional execution (if configured appropriately).

這個過濾器就是自動檢測事務管理的目前線程使得hibernate session可用,而且可以運用到配置了事務和沒有事務層的service層。是以,如果沒有配置這個過濾器,自然你用getcurrentSession是找不到的session的。

注意 :使用 hibernate4,在不使用OpenSessionInView模式時,在使用getCurrentSession()時會有如下問題:

當有一個方法list 傳播行為為Supports,當在另一個方法getPage()(無事務)調用list方法時會抛出org.hibernate.HibernateException: No Session found for current thread 異常。

這是因為getCurrentSession()在沒有session的情況下不會自動建立一個,不知道這是不是Spring3.1實作的bug,歡迎大家讨論下。

是以最好的解決方案是使用REQUIRED的傳播行為。

參考部落格:

http://www.oschina.net/question/659963_87447?fromerr=Uacffrx8

http://stackoverflow.com/questions/15939932/hibernateexception-no-session-found-for-current-thread-when-calling-service-from