How to create an auto-generated Date/timestamp field in a Play! / JPA?
我想在实体对象上添加一个日期/日期时间/时间戳字段,该字段将在创建/持久化实体并设置为"立即"时自动创建,以后不再更新。
其他用例包括始终更新以包含实体最后修改日期的字段。
我曾经在mysql模式中实现过这样的需求。
游戏中最好的方法是什么?JPA?
有一个代码片段,您可以根据自己的需要进行调整。看一看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | // 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(); } } |
我认为你至少可以用两种方式来实现它。
数据库默认值
我认为最简单的方法是将列标记为
JPA生命周期回调方法
另一种方法是提供一个
如果您希望在修改实体时更新日期,同样可以实现
记住,如果您使用的是日期对象,那么您应该对日期对象进行防御性复制(因此,您应该返回类似于