10

フィールドを持つエンティティがあります

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "edit_timestamp", 
        columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date editTimestamp;

@Version
@Column(name = "edit_count")
private short editCount;

private String text;

Spring-Data-JPAで更新しようとすると、 edit_count がインクリメントされていることがわかりますが、 edit_timestamp は同じままです。手動で SQL を呼び出す場合

UPDATE post SET TEXT='456' WHERE post_id=1;

edit_timestamp が更新されます。追加すると

@PreUpdate
protected void onUpdate() {
    editTimestamp = new Date();
}

問題なく動作します。私の質問は、なぜ @PreUpdate なしで edit_timestamp が更新されないのですか?

4

3 に答える 3

11

updateable = false を含めるように列の注釈を変更する必要があります。これにより、edit_timestamp 列が更新 SQL に表示されなくなるため、JPA プロバイダーはフィールドの現在の値を含めず、デフォルトをオーバーライドします。

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "edit_timestamp", 
        updatable = false,
        columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date editTimestamp;
于 2012-09-02T15:16:35.210 に答える