我正在玩JPA(Eclipselink具体)。以下实体有一个 每当该实体上次更新时应该反映的时间戳。
每次自动更新时间戳的JPA更新策略是什么? 这个实体改变了吗?
如果我还想要一个'创建'时间戳,我该如何处理,只有在第一个持久化实体时才设置,永远不允许再次更改?
@Entity
public class Item implements Serializable {
private static final long serialVersionUID = 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;
}
}
答案 0 :(得分:16)
使用@PrePersist和@PreUpdate注释并编写自己的事件监听器。
请查看this answer了解详情。它被标记为Hibernate,但适用于任何JPA提供程序。
答案 1 :(得分:2)
如果您使用的是mysql,我认为您可以执行以下操作来禁用从实体更新的时间戳
@Column(name = "lastUpdate", updatable= false, insertable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdate;
对于oracle,您需要使用@PreUpdate注释设置实体的时间戳,如上所述。
答案 2 :(得分:1)
实际上, surajz 回答有效。考虑一个跟踪2个时间戳的场景。您想通过实体手动更新它们。您需要将一个设置为updateble=false
(更新记录时不希望更新的那个),并让另一个免费更新。
这对我有用。