hibernate.current_session_context_class

  不少時候咱們使用hibernate的session時,都是讓session在某一運行環境中保持其惟一。例如在同一線程內用同一個session,在同一方法內用同一session,這樣咱們就能夠用session裏面緩存好的數據。但,我想說的不是緩存,且聽我一一道來。
        最近試用spring3.0.2+struts2.18+hibernate3.3.2學習搭建一個web項目,出現了一個至關鬱悶的問題。就是我明明配置好了spring管理hibernate事務了, 當我在dao中執行hibernate的方法時,如save,delete,update,createQuery,老是說不能在沒有活動的事務中執行(org.hibernate.HibernateException: createSQLQuery is not valid without active transaction)。立立刻google查,一無所得。曾幾度懷疑是否配置寫出了,dao或service寫錯了,改來改去的依舊存在問題。當時至關鬱悶啊,想啊,你spring不是幫我管理事務麼?你不自動開啓事務啊,還要我手動開啓啊。立馬查spring文檔,從中文到英文,沒發現什麼有參考價值的線索,真是至關的打擊。代碼亂改一通,發現用spring的hibernatetemplate來進行數據操做又正常無比。不死心的去查了hibernate的doc,一個不留神給哥發現了一個冗長的配置屬性:hibernate.current_session_context_class。內心巨爽無比,就是你丫啦。小樣的,哥把你滅了。
        hibernate.current_session_context_class是作什麼用的呢? 通俗點來說,就是配置session綁定到某一運行環境,例如從同一個線程中用getCurrentSession()取得的session都是同一個,當前沒有session就自動建立一個返回給你丫用。問題就出在這裏了,官方文檔以下說:

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

相關文章
相關標籤/搜索