2011-07-06 101 views
7

我有一個領域ON UPDATE CURRENT_TIMESTAMP和JPA

@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(); 
} 

它工作不W/O問題。我的問題是爲什麼w/o @PreUpdate edit_timestamp沒有更新?

+1

對於downvoter,請提供您的評論... –

回答

6

這是一個古老的問題,但我認爲如果其他人發現它有用,我會拋出一個答案。 我認爲你需要改變列註釋以包含updatable = false。這將導致edit_timestamp列在update sql中不顯示,因此JPA提供程序不會包含導致它覆蓋默認值的字段的當前值。

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

這是部分工作。使用updatable = false時,edit_timestamp列不會顯示在更新查詢中。從數據庫中,我發現edit_timestamp已更新。但是,editTimestamp的getter不知道更新的值,因爲它不是由@PreUpdate觸發的,所以它仍然返回舊值。 –

0

因爲在最初的一組註釋中,所有關於edit_timestamp列的信息都告訴它它是一個時間戳; JPA不知道它需要更新它。我在猜測,當你手動執行SQL語句時,你有某種更新觸發器正在爲你更改這些字段 - 但是當你更新它時將被來自持久實體的數據覆蓋。
如果你不需要'編輯'計數/時間戳,請嘗試從實體中刪除它們,看看是否有效。否則,你有一個工作解決方案。

相關問題