繁体   English   中英

@CreatedDate 在更新时设置为 null (spring-data-jdbc)

[英]@CreatedDate set to null on update (spring-data-jdbc)

我正在尝试将@CreatedDate与 spring-data-jdbc 和 PostgreSQL 数据库结合使用来跟踪首次创建表条目的时间。 这在插入新行时有效(它正确地将其设置为当前日期),但是在更新条目时,我得到异常,因为它被设置为 null,这是我的配置不允许的。

这是我的实体(省略了其他不相关的字段):

@Table("my_entity")
public class MyEntity {

    @Id
    private final Long id;

    @Column("created_at")
    @CreatedDate
    private Instant createdAt;

    public MyEntity (Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public Instant getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Instant createdAt) {
        this.createdAt = createdAt;
    }
}

这是我的存储库:

public interface MyRepository extends CrudRepository<MyEntity, Long> {}

这是相关的配置:

@Configuration
@EnableJdbcRepositories("com.example")
@EnableJdbcAuditing
public class JdbcConfig extends AbstractJdbcConfiguration {
}

使用repository.saveAll()方法,第一次正确设置createdAt字段。 当使用相同的方法更新现有实体时,当我希望该字段被跳过时,它被设置为 null。

我已经尝试了以下方法:

  • 按照 spring-data-rest 的建议删除公共 getter 和 setter(见这里) - 没有改变任何东西
  • 按照 JPA 的建议设置@Column(name="created_at", updatable="false") (请参见此处) - 此字段不适用于我正在使用的注释( org.springframework.data.relational.core.mapping.Column

到目前为止,我发现的两个解决方案是使用数据库触发器或在更新实体之前手动从数据库中检索实体并手动设置创建日期(这里也提到过)。 还有其他选项还是我配置错误? 这是预期的行为吗?

如您所见,解决方案是:

  1. 完全更新时手动设置您的createdAt full update意味着使用现有 id 创建一个新实例)
  2. 部分更新partial update意味着您将记录保存到持久性上下文中,例如使用 findById,然后更新并保存回来)

当您启用@EnableXXXAuditing时,它将确定您的repo.save()insert还是update ,然后分别更新您的@CreatedDate@LastModifiedDate

在您的情况下:未设置createdAtfull update Spring Data JDBC 将根据您的记录 ID 来确定您的记录是否应该插入或更新Entity State Detection Strategies 如果它看到 ID 存在,它会进行update @EnableXXXAuditing update的行为仅设置为@LastModifiedDate所以你createdAt仍然是null 这就是你遇到麻烦的原因。

仅供参考: 这里是关于@EnableXXXAuditing的简短说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM