java - 捕获异常的 Spring 事务

标签 java spring hibernate jpa spring-data

最近一直在使用Spring boot + spring data jpa + hibernate。我在 Spring 交易中遇到了一个问题。这是我的服务类和两个问题:

@Transactional
@Service
class MyService {

    @Autowired
    private MyRepository myRep;

    public void method_A() {
       try {
          method_C();

          .....

          method_B();
       } catch(Exception e) {}
    }

    public void method_B() {
       Entity e = new Entity();
       e.set(...);

       myRep.save(e);
    }

    public void method_C() throws Exception {
       ....
    }
}

1.如果方法 method_C() 抛出异常,我想捕获它并记录它,事务不会在方法 method_B() 中回滚,因为异常未到达 Spring 框架。那么我应该怎么做才能捕获 method_C() 的异常,同时又不失去回滚方法 method_B() 的能力?

2.考虑新方法method_A()

public void method_A() {
   for(...) {
      ...
      ...
      method_B();
   }
}

我想在循环中调用 method_B()。如果在 method_B() 中发生异常,我希望 method_B() 的事务被回滚,但是 method_A() 不应退出并且循环应该继续执行。我怎样才能做到这一点?

最佳答案

我通过这种方式解决了我的 2 个问题:创建了另一个 @Service 类并将 method_B() 移入其中。我已将此类注释为 @Transactional。现在方法 method_A() 看起来像这样:

public void method_A() {
   for(...) {
      ...
      try {
         anotherService.method_B();
      } catch (Exception e) {
         logger.error(...);
      }
   }
}

如果RuntimeException发生在method_B()方法中,异常会被正确记录,method_B()的事务被回滚并且循环连续的。感谢大家的回复。

关于java - 捕获异常的 Spring 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712581/

相关文章:

java - 与编码相关的数据库连接错误

java - Rail 的 'Gotchas' 和学习曲线 - 它会停止吗?

hibernate - NoClassDefFound错误: org/hibernate/cfg/Configuration

sql - 来自 grails 项目的 hibernate AssertionFailure

java - 返回具有泛型的对象子类

java - 转义 XML 字符的最佳实践?

spring - spring计划任务和spring批处理作业有什么区别

java - 克隆方法是否克隆覆盖的方法?

Java,正则表达式 : Replace fields in Json by field key

java - Hibernate Jsp Servlet 注册表单不起作用