2011-05-27 88 views
1

在我們的基本實體類(所有實體派生自)中,我們有2個方法。一個註釋爲@PrePersist,其中基本上只設置dateCreated,另一個註釋爲​​,其設置dateUpdated字段。在JPA實體上實現「觸摸」?

這是完美的,因爲我們不希望在創建時設置dateUpdated字段。作爲設計的一部分,我們也制定了兩種方法protected,這樣其他開發人員就不會明確地混淆這兩個日期(也沒有設置者)。

另外,我們可以很容易地擴展任何實體,通過在實際實體上定義一個方法來創建dateUpdated字段,並用@PrePersist對其進行註釋,因此本部分將進行介紹。

現在,我目前的問題是,我們想要明確更新實體上的dateUpdated字段,但沒有任何數據更改(基本上爲touch it)。有沒有這樣做的優雅方式?我真的不想實現一個方法來改變它的一個字段然後改回它。我們希望繼續擁有這些領域沒有setter方法的實體。

謝謝!

回答

6

您是否嘗試過更改dateUpdated字段值?我想這應該修改爲Hibernate的實體,和Hibernate會調用​​方法,將設置dateUpdated現場發回的當前時間:

public void touch() { 
    this.dateUpdated = -1; 
} 
+0

好東西。我其實只是在以前閱讀過這篇文章。請試試看,謝謝。 – 2011-05-27 13:03:04

+1

完美地工作,謝謝! (除了不能'this.dateUpdated = -1',因爲你不能將'int'賦值給'Date'字段,但是'this.dateUpdated = null'有100%的效果。 – 2011-05-30 07:02:15

0

使用@Version註釋您的dateUpdated字段,刪除preUpdate回調並在提交事務之前使用em.lock(entity,LockModeType.WRITE)。 Remamber該實體需要管理,以強制版本列更新

+0

我不認爲這會爲我們工作。我們已經在實體上有一個版本字段。此外,版本字段不是嚴格意義上的日期,而是一個表示爲日期的整數。 – 2011-05-27 12:59:03