我遇到以下问题:

我有2节课(A和B)。类A有一个用@Transaction(noRollBackFor = ExceptionB.class)注释的方法(方法1),该方法从类B调用method2。ExceptionB是未经检查的RunTimeException。

public class A {
    ...

    @Resource
    private B b;

    @Transaction(noRollBackFor = ExceptionB.class)
    public void method1() {

      try {
            b.method2();
      } catch (ExceptionB e) {
            // Change objects annotated with @Entity (must be persisted)
            throw e;
      }

    }
}

@Transaction
public class B {
    ...

    public void method2() {
            ...
            throw new ExceptionB();
    }
}


但是,当类B引发异常时,Spring Interceptor会获取异常并使用类B事务注释规则(不具有noRollBackFor规则)并进行事务回滚。这样,方法1中所做的所有更改都不会保留。
我应该更改为未发生回滚?

先感谢您。

最佳答案

好吧,我已经解决了我的问题。
关键是类B由@Transaction注释,因此对于每个称为(例如method2)的公共方法,将创建一个没有noRollBack属性的新事务。
以这种方式,对于我来说,解决方案是从类中删除@Transaction注释,并将其仅添加到需要新事务的方法中,即method2没有注释。

就这样!

关于java - 异常后未持久保存JPA实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3300282/

10-10 06:42