2012-05-21 52 views
3

Spring在我們團隊的Java EE項目中使用,而hibernate用於基礎ORM。spring如何管理hibernate會話生命週期

transactionManager的設置如下圖所示:

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

SessionFactory的設置如下圖所示:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 
<property name="packagesToScan" 
value="com.company.model" /> 
<property name="hibernateProperties"> 

<value> 
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect 
hibernate.show_sql=true 
hibernate.jdbc.fetch_size=50 
</value> 
</property> 
</bean> 

我quesiton是thoughtout整個設置,我沒有看到任何屬性設置爲休眠會話生命週期。在hibernate參考中,引入了上下文會話,據說有三個CurrentSessionContext實現。

  1. JTA 2.Thread 3.Managed

我怎麼知道哪一個實現已經used.Maybe的春天,但我不知道。

+1

檢查這裏類似的問題http://stackoverflow.com/questions/8724259/spring-hibernate-session-lifecycle –

+0

我讀過你的建議後,但仍沒有得到確切的答案。 – Guanguan

回答

3

SessionFactory是由Spring使用給定的dataSource創建的,並從連接池中獲取其數據庫連接。我們通過SessionFactory.getCurrentSession()獲得一個Hibernate會話。然後開始事務,完成工作,然後commit()或rollback(),並在最後關閉連接(連接對象將返回到池)。當我們停止應用程序或關閉服務器時,Hibernate會話工廠將被銷燬/關閉。並且默認情況下,如果使用HibernateTransactionManager,將使用CurrentSessionContext的Thread實現。如果您想使用jta實現:您必須使用「JtaTransactionManager」作爲事務管理器。

+0

這很酷,有一個問題是你說的「和默認情況下,如果你使用HibernateTransactionManager,將使用CurrentSessionContext的Thread實現。」但是我怎樣才能從官方文檔中獲得? – Guanguan

0

hibernate.current_session_context_class配置參數定義應使用哪個org.hibernate.context.CurrentSessionContext實現。爲了向後兼容,如果未配置此配置參數,但配置了org.hibernate.transaction.TransactionManagerLookup,則Hibernate將使用org.hibernate.context.JTASessionContext.,您還可以通過設置該屬性並使用短格式作爲'jpa'來配置它。

所以默認情況下,您使用'jpa' - 您可以通過定義一個屬性來覆蓋它。

<prop key="hibernate.current_session_context_class">managed</prop> 

閱讀本文以獲取關於上下文會話的完整信息。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session