我已经在DB和JPA听众中使用了两种触发器,我已经在JPA监听器上定居了,因为:
>在JPA代码中与数据库通信的唯一代码,所以我不必担心时间戳字段过期. (如果将来会发生这种变化,我可以添加触发器并更改我的映射超级消息)
> JPA听众在我的数据库中没有必要去创建大量触发器的意义上并不那么复杂,所以我不太需要维护.由于我正在积极地开发和更改数据库结构,因为我非常乐意,不必随便更新触发器,因为我快速地重复开发.
>我完全控制数据库,并为db创建一个规则,每个表都将有一个整型pkey和整数版本,并且时间戳表将有insert_ts和update_ts列,这些是我的db中的通用规则设计让生活很简单,我有这两个映射的超级版本,使我所有的enitites简单的代码,因为我从他们扩展.
@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;
}
}