HibernateTransactionManager

HibernateTransactionManager

<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        lazy-init="true">
        <property name="dataSource" ref="dataSource" />
    </bean>


在使用spring和hibernate构建应用程序时,如果我使用DataSourceTransactionManager,则在例外情况下,它不会回滚。似乎它在不同的会话中使用自动提交。但是,如果我将事务管理器更改为org.springframework.orm.hibernate3.HibernateTransactionManager,则回滚将按预期进行。
还是如果我们使用hibernate,那么我们需要使用HibernateTransactionManager吗?

N.b:我的服务带有@Transactional(rollbackFor = { Throwable.class} )注释

最佳答案

使用普通休眠时,需要以下各项来管理事务

Session s = sessionfactory.openSession();
Transaction tx = null;
try {
tx = s.beginTransaction();
// Your data manipulation here
tx.commit();
} catch (Exception e) {
if (tx != null) { tx.rollback();}
} finally {
s.close();
}


这也是HibernateTransactionManager的功能(如果需要,打开一个会话,开始事务,然后提交/回滚)。

现在,您要执行的操作如下(对DataSourceTransactionManager有点类似,它在`DataSource而不是会话上运行)。

Session s = sessionfactory.openSession();
Connection conn = null;
try {
    conn = s.connection();
    // Your data manipulation here
    conn.commit();
} catch (Exception e) {
    if (conn != null) {
        try {
            conn.rollback();
        catch (IOExceptin) {}
    }
} finally {
    s.close();
}


由于实际的事务单元(会话)永远不会收到有关提交或回滚的通知,因此无法正常工作。因此,在最坏的情况下,取决于刷新模式,所有(或部分)都将提交。

简而言之,请始终使用适合您技术的事务管理器。

在使用普通休眠模式时,使用HibernateTransactionManager,在使用JPA时使用JpaTransactionManager,在这种情况下请勿使用DataSourceTransactionManager,因为仅在仅使用普通JDBC的情况下才可用。

DataSourceTransactionManager明确声明它在DataSource和基础连接上运行。当使用Hibernate时,事务由休眠Session控制,这是HibernateTransactionManager进行操作的级别。对于JPA,这是EntityManager,这是JpaTransactionManager识别的。

10-06 02:35