2012-05-21 36 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