我已经将它与数据库中的触发器和 JPA 侦听器一起使用,我选择了 JPA 侦听器,因为:
JPA 代码中唯一与数据库通信的代码,因此我不必担心时间戳字段过时。(如果将来发生这种变化,我可以添加触发器并更改映射的超级类)
JPA 侦听器不那么复杂,因为我不必在数据库中创建大量触发器,因此我需要维护的东西更少。由于我正在积极开发和更改数据库结构,因此在我快速迭代开发时不必去更新触发器。
insert_ts
我完全控制了数据库,并为数据库制定了一个规则,即每个表都将有一个整数 pkey 和一个整数版本,并且时间戳表将具有update_ts
这些列是我的数据库设计中的通用规则,所以生活很容易我有这两个映射的超类,因为我从它们扩展而来,所以我的所有实体都易于编码。
@MappedSuperclass
public abstract class PersistableObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="pkey")
private Integer pkey;
@Version
@Column(name="version")
private Integer version;
public Integer getPkey() {
return this.pkey;
}
public Integer getVersion() {
return this.version;
}
@Override
public String toString() {
return "Presistable Object: pkey=" + this.pkey + " Object: " + this.getClass().getName();
}
}
和
@MappedSuperclass
public class TimeStampedPersistableObject extends PersistableObject {
@Column(name = "insert_ts")
@Temporal(TemporalType.TIMESTAMP)
private Date insertTimestamp;
@Column(name = "update_ts")
@Temporal(TemporalType.TIMESTAMP)
private Date updateTimestamp;
@SuppressWarnings("unused")
@PrePersist
private void onInsert() {
this.insertTimestamp = new Date();
this.updateTimestamp = this.insertTimestamp;
}
@SuppressWarnings("unused")
@PreUpdate
private void onUpdate() {
this.updateTimestamp = new Date();
}
public Date getInsertTimestamp() {
return this.insertTimestamp;
}
public Date getUpdateTimestamp() {
return this.updateTimestamp;
}
}