【问题标题】:CrudRepository doesn't provide a way of checking whether saveall method got commitedCrudRepository 不提供检查 saveall 方法是否已提交的方法
【发布时间】:2020-11-03 20:49:15
【问题描述】:

我正在使用 Spring 框架的 CrudRepository 的 saveAll 方法。

validationRowRepository.saveAll(validationRows);

现在我得到了只做下一步的要求,当我们确保当前批次被持久化到数据库中并且事务被提交时。

通过查看 saveAll 方法规范,我决定采用这种方式进行检查。

    List<ValidationRow> savedRows = (List<ValidationRow>) validationRowRepository.saveAll(validationRows);
    if (Objects.equals(savedRows.size(), validationRows.size()) {
        // do the next step.
    }

即使这是真的,如果执行不进入 if 块会发生什么? 所以我的问题是: 有没有更合适的方式来实现这种场景。

【问题讨论】:

  • 我不熟悉 API,但我假设如果出现任何问题,就会引发异常。
  • 您找到问题的答案了吗?

标签: java spring-boot spring-data-jdbc


【解决方案1】:

有两点需要考虑:

  1. 将数据写入数据库
  2. 提交事务

saveAll的合约如下:

所有实体都将写入数据库。如果这对至少其中一个实体不起作用,则会引发异常。 saveAll 的返回值将始终与输入值具有相同的大小。它不会包含null 值。所有包含的实体都将设置其 id 值(对象类型不是 null,原始数字类型不是 0

因此,您的 if 条件是多余的,需要测试 Spring Data JDBC 中的一个非常具体的错误。有意义的是进行测试,作为实际的 JUnit 测试,您的实体可以在保存后加载并看起来像检查过的那样。这基本上是对您的对象模型、数据库模式、映射和在 Spring Data JDBC 中实现的逻辑的一致性的测试。有很多事情可能会出错。很高兴对此进行测试。

您的代码甚至没有涉及事务的主题。控制交易有两种主要方式:

  1. @Transactional
  2. TransactionTemplate

两者都建立在 Spring 事务基础架构之上,该基础架构保证在事务提交失败时抛出异常。与我上面写的类似,编写测试可能是有意义的,即检查事务是否按预期运行的 JUnit 测试。尽管这可能很困难,因为您必须注入某种数据库故障才能做到这一点。

因此,您的实际代码所要做的就是处理调用saveAll 时可能引发的任何异常。由于使用TransactionTemplate 更容易移动事务边界,因此我在示例代码中使用了它。

try {
    validationRows = txTemplate.execute( t -> validationRowRepository.saveAll(validationRows));
    process(validationRows) // do whatever you want to do with the entities after saving
} catch (DataAccessException e) {
    // do whatever you see fit in the case of an exception. You might also skip the try catch block and just let the exception terminate the process, or in case of a web application the request.
}

【讨论】:

  • Jens Schauder 我贴在这里的那段代码是在一个方法中,被注释为@Transactional,我忘了提。
【解决方案2】:

如果您致电saveAll,则必须保存数据。在其他情况下,必须抛出异常,然后您才能处理可能的异常。您编写的代码是正确的,您真的不需要做花哨的安全性。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2017-11-17
    相关资源
    最近更新 更多