使用 Hibernate 的大多數應用程序須要某種形式的「上下文相關的」會話,特定的會話在整個特
定的上下文範圍內始終有效。然而,對不一樣類型的應用程序而言,要爲何是組成這種「上下文」下一個定義一般是困難的;不一樣的上下文對「當前」這個概念定義了不一樣的範圍。在 3.0 版本以前,使用 Hibernate 的程序要麼採用自行編寫的基於 ThreadLocal 的上下文會話,要麼採用HibernateUtil 這樣的輔助類,要麼採用第三方框架(好比 Spring 或 Pico),它們提供了基於代理(proxy)或者基於攔截器(interception)的上下文相關的會話。從 3.0.1 版本開始,Hibernate 增長了SessionFactory.getCurrentSession() 方法。一開始,它假定了採用 JTA 事務,JTA 事務定義了當前 session 的範圍和上下文(scope 和 context)。由於有好幾個獨立的 JTA TransactionManager 實現穩定可用,不管是否被部署到一個 J2EE 容器中,
大多數(倘若不是全部的)應用程序都應該採用 JTA 事務管理。基於這一點,採用 JTA 的上下文相關的會話能夠知足你一切須要。
再來看個人配置,講hibernate.current_session_context_class的值設成thread。按我簡單的理解就是將getCurrentSession()返回的session綁定到當前運行線程中。比較專業的說法是此session的上下文是thread,但不是spring已經託管的那個Session對象。再用哥那大腿想了幾下,瞬間瞭解了一些。因此獲取的session是在spring代理的上下文以外的的當前線程之中,因此此session並不是事務管理器代理的那個session,不會自動開啓事務。根據官方提示:第三方框架提供了基於代理(proxy)或者基於攔截器(interception)的上下文相關的會話的管理,因此把hibernate.current_session_context_class設置刪除了,一切又回到當初風平浪靜的日子了。 web
參考http://justsee.iteye.com/blog/1061576,終於瞭解這個問題的來龍去脈。摘錄以下: spring
在ssh2中的sessionFactory配置文件中應將hibernate.current_session_context_class設爲org.springframework.orm.hibernate3.SpringSessionContext(默認爲此值),並應用spring管理事務。 緩存
若是爲<prop key="hibernate.current_session_context_class">thread</prop> 則會報異常, session
緣由仍是spring中hibernate.current_session_context_class的問題 框架
在spring的類LocalSessionFactoryBean源碼,方法buildSessionFactory中將hibernate.current_session_context_class設爲org.springframework.orm.hibernate3.SpringSessionContext ssh