【问题标题】:Spring-data-JDBC Save (Update) doesn't updateSpring-data-JDBC 保存(更新)不更新
【发布时间】:2021-11-10 06:26:09
【问题描述】:

我有一个 Spring 应用程序,其中域对象标识符不是由数据库分配的,而是由应用程序生成的。在 BeforeSave 回调期间生成标识符并将其添加到域对象。保存域对象(插入)后,当尝试使用相同的标识符(更新)保存域对象时,我收到以下错误

原因:org.springframework.dao.IncorrectUpdateSemanticsDataAccessException:无法更新实体 [com.example.UUIDTest.DomainObjectLongId@77ccded4]。在数据库中找不到 ID [2997744842191684912]。

我创建了几个测试示例。在 DomainObject 示例中,我将 ID 生成为 UUID。在 DomainObjectLongId 示例中,我将 ID 生成为 Long。在这两个示例中,使用 Spring-Data-JDBC 存储库时保存(更新)失败。手动生成 SQL 并使用它来更新成功。

我创建了一个让数据库自动生成 ID 的测试示例。在这种情况下保存(更新)时,它会成功且没有任何错误。

如何让 Spring-Data-JDBC 使用提供的 id 更新域对象?

下面是包含所有 3 个测试类的 Github 存储库。其中两个使用提供的标识符保存(更新)失败,其中一个使用自动生成的标识符保存(更新)成功。

Github Spring-Data-JDBC-UUID-Test

【问题讨论】:

    标签: spring-data spring-data-jdbc


    【解决方案1】:

    终于想通了。我一直在更改 DomainObject 的 ID

    aggregate.setId(UUID.randomUUID());
    return aggregate;
    

    我需要检查一下是否需要设置

    if (aggregate.getId() == null) {
      aggregate.setId(UUID.randomUUID());
    }
    return aggregate;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多