使用Hibernate和MySQL创建时间戳和上次更新时间戳
对于某个Hibernate实体,我们需要存储它的创建时间和上次更新的时间。 你会如何设计?
你会在数据库中使用哪些数据类型(假设MySQL可能与JVM在不同的时区)? 数据类型是否可以识别时区?
你将在Java中使用哪些数据类型( Date
, Calendar
, long
,...)?
你会为谁设置时间戳 - 数据库,ORM框架(Hibernate)还是应用程序员?
你会用什么注释来进行映射(例如@Temporal
)?
我不仅在寻找一个可行的解决方案,而且还需要一个安全和设计良好的解决方案。
如果您使用JPA批注,则可以使用@PrePersist
和@PreUpdate
事件挂钩执行此操作:
@Entity
@Table(name = "entities")
public class Entity {
...
private Date created;
private Date updated;
@PrePersist
protected void onCreate() {
created = new Date();
}
@PreUpdate
protected void onUpdate() {
updated = new Date();
}
}
或者您可以在类上使用@EntityListener
注释并将事件代码放置在外部类中。
本文中的资源以及来自不同来源的左右信息,我带着这个优雅的解决方案,创建了以下抽象类
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@MappedSuperclass
public abstract class AbstractTimestampEntity {
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false)
private Date created;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated", nullable = false)
private Date updated;
@PrePersist
protected void onCreate() {
updated = created = new Date();
}
@PreUpdate
protected void onUpdate() {
updated = new Date();
}
}
并让所有实体扩展它,例如:
@Entity
@Table(name = "campaign")
public class Campaign extends AbstractTimestampEntity implements Serializable {
...
}
你可以使用@CreationTimestamp
和@UpdateTimestamp
:
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;
链接地址: http://www.djcxy.com/p/44043.html
上一篇: Creation timestamp and last update timestamp with Hibernate and MySQL