如何在操作后发生异常时回滚休眠操作?

时间:2013-06-04 04:47:50

标签: spring hibernate transactions atomic rollback

我有一个使用spring + hibernate创建的java应用程序。

我有这样的代码:

public class EmployeeDAO extends AbstractHibernateDAO {

    public void save(Employee emp) throws HibernateException {
        super.save(emp);    // inside this method, it calls hibernate session.save(). This super.save method can throws HibernateException
        doSometingElse(emp);    // inside this method, it doesn't call any hibernate methods. It can throws Exception too.
    }   
}

我想在事务视图中将 EmployeeDAO.save 方法作为原子方法。

如果 super.save(emp)成功但 doSomethingElse(emp)失败(通过抛出异常),那么我希望在 super.save中插入Employee记录(emp)被回滚。

怎么做?

1 个答案:

答案 0 :(得分:1)

您需要做的就是使用@Transactional注释方法,如下所示:

public class EmployeeDAO extends AbstractHibernateDAO {

    @Transactional
    public void save(Employee emp) throws HibernateException {
        super.save(emp);    // inside this method, it calls hibernate session.save(). This super.save method can throws HibernateException
        doSometingElse(emp);    // inside this method, it doesn't call any hibernate methods. It can throws Exception too.
    }   
}

这样,如果在EmployeeDAO save中抛出异常,那么整个方法的hibernate操作将被回滚。

如果您希望此类中的所有方法都在自己的事务中运行,那么请改为注释类@Transactional

您还需要确保配置了事务管理器。

如果您使用的是Spring Java配置,那么您希望事务管理器看起来像这样:

@Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory());
        transactionManager.setDataSource(datasource());
        transactionManager.setJpaDialect(new HibernateJpaDialect());
        return transactionManager;
    }