Creation timestamp and last update timestamp with Hibernate and MySQL
For a certain Hibernate entity we have a requirement to store its creation time and the last time it was updated. How would you design this?
What data types would you use in the database (assuming MySQL, possibly in a different timezone that the JVM)? Will the data types be timezone-aware?
What data types would you use in Java (
Date
,Calendar
,long
, ...)?Whom would you make responsible for setting the timestamps—the database, the ORM framework (Hibernate), or the application programmer?
What annotations would you use for the mapping (e.g.
@Temporal
)?
I'm not only looking for a working solution, but for a safe and well-designed solution.
Solution 1:
If you are using the JPA annotations, you can use @PrePersist
and @PreUpdate
event hooks do this:
@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();
}
}
or you can use the @EntityListener
annotation on the class and place the event code in an external class.
Solution 2:
You can just use @CreationTimestamp
and @UpdateTimestamp
:
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;