[英]@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。
我已经尝试了以下方法:
@Column(name="created_at", updatable="false")
(请参见此处) - 此字段不适用于我正在使用的注释( org.springframework.data.relational.core.mapping.Column
)到目前为止,我发现的两个解决方案是使用数据库触发器或在更新实体之前手动从数据库中检索实体并手动设置创建日期(这里也提到过)。 还有其他选项还是我配置错误? 这是预期的行为吗?
createdAt
。 ( full update
意味着使用现有 id 创建一个新实例)partial update
意味着您将记录保存到持久性上下文中,例如使用 findById,然后更新并保存回来) 当您启用@EnableXXXAuditing
时,它将确定您的repo.save()
是insert
还是update
,然后分别更新您的@CreatedDate
和@LastModifiedDate
。
在您的情况下:未设置createdAt
的full 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.