簡體   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