java - Spring AOP 事务管理和 Hibernate : undesired commits to database

标签 java hibernate spring transactions aop

是否可以为仅调用 DAO(数据访问对象)方法的方法启用事务处理?

类 BusinessLayerFacade 实现 Facade {

//此处不允许进行事务处理
公共(public) X foo() {
   //做一点事
}

公共(public) Y 改变了(DomainObject myObject){
   //做一点事
   //<-- 开始事务
   //调用DAO
   //做一点事
   //调用DAO
   //<-- 结束交易
}

}

允许 BusinessLayerFacade 中所有方法的事务会导致对数据库进行一些不需要的提交。例如。当调用 foo() 时,在执行 changed(DomainObject myObject) 时抛出 ExceptionmyObject 已提交到数据库而不是还原事务回滚的变化。

有什么想法吗?

这确实是一个按名称过滤方法的选项但是我们能不能在这里放一些魔法 ;-) 是否可以在 in 中第一次调用 DAO 方法时启动事务changed() 并在 changed() 返回时开始提交。如果可能的话,我在类中命名新方法时就不必小心了。

谢谢,斯特凡

最佳答案

如果抛出运行时异常,事务将回滚。如果抛出应用程序异常则不会。您可以通过应用注释 @Transactional 来自定义它:

@Transactional(rollbackFor=SomeException.class, noRollbackFor=SomeOtherException.class)

这也可以在 XML 中全局自定义,使用 tx:methodrollback-forno-rollback-for 属性元素。

阅读Spring reference documentation了解更多详情。

关于java - Spring AOP 事务管理和 Hibernate : undesired commits to database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7930955/

相关文章:

java - 从 ant 构建文件中以编程方式检索某些任务

java - Hibernate 在获取连接中重新加载实体

java - JUnit、JPA、Hibernate 和 Postgres : How to test?

java - Hibernate 4.1、Spring 3.1 和 JSF 1.2 中的 LazyInitializationException (Myfaces)

java - routeContext 中的 PropertyPlaceholderConfigurer。无法从属性文件设置 uri

java - 重复关注 javax.validation.constraints 和 javax.persistence.Column

java - Spring - 仅当值不为空时才设置属性

java - tomcat 服务器中的两个不同的 liferay 非根上下文

java - Java 7 至少和 Java 6 一样稳定吗?

spring - 如何为开发属性禁用 spring-cloud 配置服务器