我有一个使用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)被回滚。
怎么做?
答案 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;
}