【问题标题】:What state does the entity need to trigger the [update] operation?实体需要什么状态才能触发 [update] 操作?
【发布时间】:2020-03-22 16:26:08
【问题描述】:

版本:1.1.2.RELEASE

我有以下简单的测试代码

    JobTask task1 = new JobTask(null, "task1", "sync files", JobStatus.RUNNING);
    JobTask savedTask = jobTaskReponsitory.save(task1);
    savedTask.setTaskDesc("update descript.");
    jobTaskReponsitory.save(savedTask);

JobTask 聚合根包含 @Id @Version @CreatedDate @CreatedBy @LastModifiedBy @LastModifiedDate 注解。

  1. 为什么InsertRoot操作总是被触发?在第二次save()操作中,实体已经有了ID的值,我明白此时应该触发update()操作。
  2. 是否有关于@Version 的文档?我没有找到任何官方信息。

【问题讨论】:

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


    【解决方案1】:

    第一个问题的答案在于第二个问题。

    乐观锁定/Spring Data JDBC 尚不支持 @Version 属性。这就是为什么没有关于它的官方文档的原因。 There is a PR request though.

    这也意味着版本属性将根据其类型保持不变null0。 但它将被检查以确定一个实体是否被认为是新的: 如果 ID 为 null0 或者如果有一个属性用 @Version 注释为 null0,则该实体被视为新实体。

    由于在您的情况下第二个条件始终保持 true,因此 Spring Data JDBC 将始终执行 insert

    为了解决这种情况,我建议暂时删除 version 属性或至少 @Version 注释,因为它可能没有价值,因为无论如何都没有实现乐观锁定。

    【讨论】:

    • 那么乐观锁会在哪个版本实现呢?谢谢~
    • 目前看来它可能会包含在计划于 2020 年上半年发布的 2.0 版本中。
    • Spring Data JDBC 2.0 版将包含对乐观锁定的支持。我刚刚将 PR 合并到 master 中。
    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多