2010-05-06 90 views
1

我需要LastUpdatedDttm更新SYSDATE每當記錄更新。但是低於預期值並不能按需要工作。 SYSDATE只插入一次,而不是爲後續更新而更新。此外,lastUpdDTTM不是由hibernate生成的sql的一部分。可更新虛假行爲incotictent

@Generated(GenerationTime.ALWAYS) 
@Column(name="LAST_UPDATED_DTTM",insertable=false,updatable=true, columnDefinition ="timestamp default SYSDATE") 
private Date lastUpdDTTM; 

@Generated(GenerationTime.ALWAYS) 
@Column(name="CREATED_DTTM", insertable=false, updatable=false) 
private Date createdDTTM; 
+0

您正在使用哪種JPA實現?它可能有幫助。 – snowflake 2010-05-06 10:17:04

回答

0

(...)SYSDATE插入只有一次,而不是更新的後續更新。

首先,讓我清楚的東西:Generated表示該字段是由數據庫和Hibernate需要插入/更新後讀取它來更新實體產生。在列定義中使用default SYSDATE對INSERT工作正常,但對於UPDATE,則需要觸發器。

另外,lastUpdDTTM不是由hibernate生成的sql的一部分。

嗯,你告訴了Hibernate這個字段是由數據庫生成ALWAYS所以我不surpised,Hibernate並不包括在生成的SQL(實際上,我認爲,這在某種程度上與udpatable = true衝突,我希望Hibernate抱怨它)。

無論如何,正如我所說的,不是Hibernate會更新這個字段,它是數據庫,並且您需要一個觸發器,Hibernate將在更新後刷新實體以獲取新值。


一種不同的方法是使用回調的註解,例如最後更新日期:

@PreUpdate 
protected void updateDates() { 
    lastUpdDTTM = new Date(); 
} 

爲了更好的一致性,你甚至可以使用的創建日期相同的方法與@PrePersit

@PrePersist 
@PreUpdate 
protected void updateDates() { 
    Date now = new Date(); 
    if (createdDTTM == null) { 
     createdDTTM = new Date(now.getTime()); 
    } 
    lastUpdDTTM = now; 
} 
+0

再次感謝。但我真的不想使用觸發器。有沒有其他解決方案? – jpanewbie 2010-05-06 10:38:32

+0

我希望我可以使用回調。它需要DB服務器日期時間。這種方法會給我的Web服務器當前時間。 – jpanewbie 2010-05-06 11:03:38

+0

@jpanewbie的確。最後的想法是:在更新日期也使用'default SYSDATE',並在'@ PreUpdate'方法中將更新日期設置爲'null'。 – 2010-05-06 11:15:18