2011-11-20 42 views
14

我希望在實體對象上添加一個Date/DateTime/Timestamp字段,該實體對象將在實體創建/保持並設置爲「now」時自動創建,永不再次更新。如何在Play中創建自動生成的日期/時間戳字段!/JPA?

其他使用案例包括始終更新以包含實體的上次修改日期的字段。

我用來達到這樣的要求in the mysql schema

在Play中這樣做的最佳方式是什麼?/JPA?

+0

你有什麼要求說數據庫應該設置'現在'的日期值或JPA可以做到這一點嗎? –

+0

@PiotrNowicki - 它可以由JPA完成。目前,我正在使用我的應用程序代碼。 – ripper234

回答

32

有一段代碼可以適應您的需要。看看:

// Timestampable.java 

package models; 

import java.util.Date; 

import javax.persistence.Column; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.MappedSuperclass; 
import javax.persistence.PrePersist; 
import javax.persistence.PreUpdate; 
import javax.persistence.Version; 

import play.db.ebean.Model; 

@MappedSuperclass 
public class Timestampable extends Model { 

    @Id 
    @GeneratedValue 
    public Long id; 

    @Column(name = "created_at") 
    public Date createdAt; 

    @Column(name = "updated_at") 
    public Date updatedAt; 

    @Version 
    public int version; 

    @Override 
    public void save() { 
    createdAt(); 
    super.save(); 
    } 

    @Override 
    public void update() { 
    updatedAt(); 
    super.update(); 
    } 

    @PrePersist 
    void createdAt() { 
    this.createdAt = this.updatedAt = new Date(); 
    } 

    @PreUpdate 
    void updatedAt() { 
    this.updatedAt = new Date(); 
    } 
} 
+0

這工作,謝謝。除了上面的內容,如果您不更新列屬性@Column(name =「created_date」,updatable = false) 它將爲空。 – Buminda

20

我認爲你至少可以通過兩種方式實現它。

數據庫默認值

我認爲最簡單的方法是,以紀念列updateable=false, insertable=false(這會給你永恆 - JPA的將不包括此列到INSERTUPDATE報表),並設置數據庫列的默認值爲NOW。

JPA生命週期回調方法

其他方式將提供這將設置你的約會對象的實際日期new Date()一個@PrePersist生命週期回調方法。那麼你需要確保沒有人會編輯這個值,所以你不應該爲這個屬性提供任何setter。

如果您希望更新實體時更新日期,則可以類似地實施​​生命週期回調方法,該方法將設置實際修改日期。

只要記住,如果你與Date對象的工作,你應該做你的Date對象的防守副本(所以你應該返回類似new Date(oldDate.getTime());而非純return oldDate)。
這將阻止用戶使用日期的getter並修改其狀態。

+0

我在哪裏標記列updateable = false等...?使用註釋? 另外,爲什麼我需要一個關於獲得者的防禦副本? Getters不會調用'save()',那麼值怎麼改變? – ripper234

+0

是的,在日期字段中添加'@ Column'註釋(如果使用的話,可以在'orm.xml'文件中進行)。 'java.util.Date'是一個可變類。用戶可以使用getter獲取它,所以他獲得了對你的類日期字段的引用。他可以調用date.setTime(1),從而改變日期狀態。然後,JPA將持久保存用戶更改的日期對象。 –

+0

如果您顯式調用'save()',JPA將僅保留。無論如何,如果「用戶」是指「能夠在我的項目中編寫Java代碼的人」,那對我來說這不是問題。如果你的意思是我的網站的實際訪問者,我不明白他們如何能夠在日期對象上調用'set'。 – ripper234

相關問題