我希望在實體對象上添加一個Date/DateTime/Timestamp字段,該實體對象將在實體創建/保持並設置爲「now」時自動創建,永不再次更新。如何在Play中創建自動生成的日期/時間戳字段!/JPA?
其他使用案例包括始終更新以包含實體的上次修改日期的字段。
我用來達到這樣的要求in the mysql schema。
在Play中這樣做的最佳方式是什麼?/JPA?
我希望在實體對象上添加一個Date/DateTime/Timestamp字段,該實體對象將在實體創建/保持並設置爲「now」時自動創建,永不再次更新。如何在Play中創建自動生成的日期/時間戳字段!/JPA?
其他使用案例包括始終更新以包含實體的上次修改日期的字段。
我用來達到這樣的要求in the mysql schema。
在Play中這樣做的最佳方式是什麼?/JPA?
有一段代碼可以適應您的需要。看看:
// 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();
}
}
這工作,謝謝。除了上面的內容,如果您不更新列屬性@Column(name =「created_date」,updatable = false) 它將爲空。 – Buminda
我認爲你至少可以通過兩種方式實現它。
數據庫默認值
我認爲最簡單的方法是,以紀念列updateable=false, insertable=false
(這會給你永恆 - JPA的將不包括此列到INSERT
和UPDATE
報表),並設置數據庫列的默認值爲NOW。
JPA生命週期回調方法
其他方式將提供這將設置你的約會對象的實際日期new Date()
一個@PrePersist
生命週期回調方法。那麼你需要確保沒有人會編輯這個值,所以你不應該爲這個屬性提供任何setter。
如果您希望更新實體時更新日期,則可以類似地實施生命週期回調方法,該方法將設置實際修改日期。
只要記住,如果你與Date對象的工作,你應該做你的Date對象的防守副本(所以你應該返回類似new Date(oldDate.getTime());
而非純return oldDate
)。
這將阻止用戶使用日期的getter並修改其狀態。
我在哪裏標記列updateable = false等...?使用註釋? 另外,爲什麼我需要一個關於獲得者的防禦副本? Getters不會調用'save()',那麼值怎麼改變? – ripper234
是的,在日期字段中添加'@ Column'註釋(如果使用的話,可以在'orm.xml'文件中進行)。 'java.util.Date'是一個可變類。用戶可以使用getter獲取它,所以他獲得了對你的類日期字段的引用。他可以調用date.setTime(1),從而改變日期狀態。然後,JPA將持久保存用戶更改的日期對象。 –
如果您顯式調用'save()',JPA將僅保留。無論如何,如果「用戶」是指「能夠在我的項目中編寫Java代碼的人」,那對我來說這不是問題。如果你的意思是我的網站的實際訪問者,我不明白他們如何能夠在日期對象上調用'set'。 – ripper234
你有什麼要求說數據庫應該設置'現在'的日期值或JPA可以做到這一點嗎? –
@PiotrNowicki - 它可以由JPA完成。目前,我正在使用我的應用程序代碼。 – ripper234