Spring + Hibernate 会话管理

3

我一直在阅读有关使用Spring和Hibernate的内容,但是关于会话管理方面我感到非常困惑。希望有人能为我解答几个问题。

首先,当使用HibernateTemplate时我不知道如何管理会话。当您调用模板上的Save()方法时,会话是否打开并关闭?当使用find()方法时,是否返回分离的对象?

我已经阅读了Spring事务部分,但它主要讨论异常处理。我希望找到一种将Hibernate会话绑定到Spring事务的方法,以便在事务结束时提交对Hibernate对象所做的更改。是否有实现这一点的方法?

1个回答

2

Spring为您管理会话。查看文档,特别是第13.3.1节,您会发现

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
  </bean>

然后在第13.3.3节中,您会看到这个:

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

仔细观察,您会发现会话工厂使用数据源,而事务管理器使用会话工厂,这样Spring就可以为您获取会话,并将所有持久化代码包装在一个事务中。


这个内容不是很清楚实际发生了什么。如果这个事务管理器被用于特定的方法,那么这个方法内部所有的数据库访问都会在同一个Hibernate会话中进行吗?如果我在这个方法内部加载Hibernate对象,那么对它所做的更改是否会在方法结束时提交? - toc777
@toc 事务管理器始终在使用中。根据您指定要保护哪些方法的方式不同,它会执行不同的操作。会话在关闭之前会自动刷新;Hibernate 管理该过程,而非 Spring。建议您查看 opensessioninview 过滤器。 - hvgotcodes
@toc,如果你想知道它是如何工作的,我建议你下载源代码,然后使用调试器来逐步执行你的代码。 - hvgotcodes
但是是Spring打开和关闭会话,对吧?我问这个问题的原因是我想从我的代码中消除许多save()和update()方法调用。目前,我正在使用Dao获取一个对象,然后修改它,然后调用saveOrUpdate()。如果事务管理器在进入方法之前创建了一个会话,并在退出时关闭了它,我就不需要调用saveOrUpdate()。 - toc777
就个人而言,我不会担心调用saveOrUpdate。当会话关闭时,会话将决定要做什么。 - hvgotcodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接