Ответ 1
Я использовал его в обоих режимах с помощью триггеров в базе данных и с слушателями JPA, я остановился на слушателях JPA, потому что:
-
единственный код, говорящий с базой данных в JPA-коде, поэтому мне не нужно беспокоиться о том, что поля временной метки не соответствуют дате. (Если это изменится в будущем, я могу добавить триггеры и изменить мои настроенные супер-кальки)
-
Слушатели JPA менее сложны в том смысле, что мне не нужно было создавать множество триггеров в моей базе данных, поэтому у меня было меньше вещей для поддержки. Поскольку я активно развиваю и меняю структуру db, я стараюсь не переходить и обновлять триггеры, поскольку я быстро перебираю развитие.
-
Я имею полный контроль над базой данных и сделал правило для 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;
}
}