给定如下所示的实体,您可以跟踪其字段之一的更改(同时也保留其原始值)。
@Entity
@Table(schema = "test", name = "test")
public final class Test {
private static final int ORIGINAL = 0;
private static final int CURRENT = 1;
private Integer id;
// holds the original and current state of the field
private final AtomicReferenceArray<String> field = new AtomicReferenceArray<>(2);
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Transient
public String getOriginalField() {
return field.get(ORIGINAL);
}
@Basic
public String getField() {
return field.get(CURRENT);
}
public void setField(String field) {
this.field.compareAndSet(ORIGINAL, null, field);
this.field.set(CURRENT, field);
}
@PreUpdate
public void preUpdate() {
System.out.format("Original: %s, New: %s\n", getOriginalField(), getField());
}
...
}
如果数据库中有一行,如下所示:
id: 1
field: a
version: 2011-12-02 11:24:00
之前field已更新(例如,从a
to b
)您将得到以下输出。
Original: d, New: b
即使实体被多次更新,原始值也会被保留,并且两个状态都可以通过相应的 getter 访问(getField and 获取原始字段——在命名方面你可以比我更有创意:)。
这样,您就可以不用在数据库中创建版本列,并且还可以向客户端隐藏实现细节。
而不是一个AtomicReferenceArray
您可以使用数组、列表等来跟踪所有更改,就像这样。
The @PreUpdate
当然不是必需的,但这样您就可以收到实体状态更改的通知,并将更新的字段自动保存到文件中。还有更多这样的注释:请参阅文档javax.持久性 http://docs.oracle.com/javaee/5/api/javax/persistence/package-summary.html对于其他注释类型。