Last update timestamp with JPA
I'm playing around a bit with JPA(Eclipselink to be specific). The below entity have a timestamp that's supposed to reflect whenever that entity was last updated.
What are the strategies for making JPA update that timestamp automatically every time this entity is changed ?
How would I go about if I also want a 'creation' timestamp, only set when the entity is first persisted, never allowed to be changed again ?
@Entity
public class Item implements Serializable {
private static final long serialVer开发者_JAVA技巧sionUID = 1L;
private Integer id;
private String note;
public Item () {
}
@Id
@GeneratedValue(strategy=SEQUENCE)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=255)
@Column(nullable=false)
public String getNote() {
return this.note;
}
public void setNote(String note) {
this.note = note;
}
@Column(nullable=false)
public Timestamp getUpdated() {
return this.updated;
}
public void setUpdated(Timestamp updated) {
this.updated = updated;
}
}
Use @PrePersist and @PreUpdate annotations and write your own event listener.
Take a look at this answer for details. It's tagged as Hibernate but is applicable to any JPA provider.
if you are using mysql, I think you can do the following to disable the timestamps from being updated from entity
@Column(name = "lastUpdate", updatable= false, insertable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdate;
for oracle you time have to set the timestamps from the entity using @PreUpdate annotation as explained above.
Actually, surajz answer works. Consider a scenario where you are tracking 2 timestamps. You want to manually update them via the entity. You'd need to set one to updateble=false
(the one you do not want updated when the record is updated), and leave the other free for updates.
That's what worked for me.
In Entity class
@Column
@UpdateTimestamp
private Timestamp updatedOn
@Column
@CreationTimestamp
private Timestamp createdOn
it will update automatically when any change in entity
Supported attribute types
java.time.LocalDate (since Hibernate 5.2.3)
java.time.LocalDateTime (since Hibernate 5.2.3)
java.util.Date
java.util.Calendar
java.sql.Date
java.sql.Time
java.sql.Timestamp
Example :
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@CreationTimestamp
private Timestamp createdOn;
@UpdateTimestamp
private Timestamp updatedOn;
}
精彩评论