spring如何管理hibernate会话生命周期

时间:2012-05-21 06:23:14

标签: spring hibernate session lifecycle

Spring在我们团队的Java EE项目中使用,而hibernate用于底层ORM。

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>

我的问题考虑了整个设置,我没有看到任何hibernate会话生命周期的属性设置。在hibernate参考中,引入了Contextual会话,并且说有三个CurrentSessionContext实现。

  1. JTA 2.Thread 3.Managed
  2. 我怎么知道使用了哪个实现。也许是Spring,但我不知道。

2 个答案:

答案 0 :(得分:3)

SessionFactory由Spring使用给定的dataSource创建,并从连接池获取其数据库连接。我们通过SessionFactory.getCurrentSession()获得一个Hibernate会话。然后启动事务,执行工作然后commit()或rollback(),最后关闭连接(连接对象将返回到池)。当我们停止应用程序或关闭服务器时,Hibernate会话工厂将被销毁/关闭。默认情况下,如果使用HibernateTransactionManager,将使用CurrentSessionContext的Thread实现。如果你想使用jta实现:你必须使用“JtaTransactionManager”作为事务管理器。

答案 1 :(得分:0)

hibernate.current_session_context_class配置参数定义应使用哪个org.hibernate.context.CurrentSessionContext实现。为了向后兼容,如果未配置此配置参数但配置了org.hibernate.transaction.TransactionManagerLookup,则Hibernate将使用org.hibernate.context.JTASessionContext.,您也可以通过设置属性并使用shortform作为&#39; jpa&来配置#39;

因此,默认情况下,您正在使用&#39; jpa&#39; - 您可以通过定义类似的属性来覆盖它。

<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