【问题标题】:JPA/Hibernate rolling back list of children is not workingJPA/Hibernate 回滚子列表不起作用
【发布时间】:2021-02-15 07:28:44
【问题描述】:

我正在使用带有 Java Springboot 的 DB2 数据库和 JPA/Hibernate,但是在使用 JPA 的 .save() 方法时回滚事务不起作用。我的主要实体没有被保存,因为它被另一个程序使用/阻止,但它的子实体被保存了。但我需要全部或全部!

例如: 我的项目 A 和 B 中有两个实体。A 有一个 B 列表:

@Entity
@Data // Lombok
public class A {
  @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  private List<B> bs;
}

@Entity
@Data
public class B {
  // some fields.
}

当我将 B 添加到 A 中的列表并保存时,它应该在 B 的 db-table 中添加一行。这工作正常。
但是如果 A 有错误,即它被另一个程序阻止,它也会保存更改的 B,但它不应该。我已经尝试过使用@Transactional,但它并没有改变任何东西。保存 A 返回一个异常,但 Bs 列表被保存,尽管它应该回滚到我的理解:/

try {
  A savedA = aRepository.save(a);
  return savedA;
} catch (DataAccessException e) {
  throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Is already used by another program.", e);
}

【问题讨论】:

    标签: java spring jpa transactions db2


    【解决方案1】:

    也许您在数据源上配置了自动提交?这是一个与事务/数据源相关的春季问题,因此您可能应该更改标签/标签。

    【讨论】:

      【解决方案2】:

      我认为问题在于 Spring 的默认事务策略是针对未经检查的异常 1.4.3. Rolling Back a Declarative Transaction

      在其默认配置中,Spring 框架的事务基础结构代码仅在运行时、未经检查的异常情况下将事务标记为回滚。也就是说,当抛出的异常是 RuntimeException 的实例或子类时。 (默认情况下,错误实例也会导致回滚)。从事务方法抛出的检查异常不会导致默认配置回滚。

      这意味着子异常是 java.lang.RuntimeException 的子类,或者 Error 它会回滚。 但是子异常是java.lang.Exception的子类,比如IOException、TimeoutException,它不会回滚。

      我认为你的异常是 TimeoutException 所以它不会回滚。 所以现在可能是你的问题是如何回滚检查的异常,你可以检查这个Spring: automatic rollback on checked exceptions

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-15
        • 2014-07-14
        • 2013-07-15
        • 1970-01-01
        相关资源
        最近更新 更多