[英]@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.