我有多个表,其中UPDATE_TIME和INSERT_TIME列必须由应用程序代码管理。有没有办法避免在每个Entity类中重复列定义和行为?具体来说,我想以某种方式考虑列定义和@ PrePersist / @PreUpdate方法。
@Entity
@Table(name="THINGS")
public class Thing {
// ... other columns ...
@Column(name = "INSERT_TIME")
private Date insertTime;
@Column(name = "UPDATE_TIME")
private Date updateTime;
@PrePersist
protected void onCreate() {
insertTime = new Date();
}
@PreUpdate
protected void onUpdate() {
updateTime = new Date();
}
}
答案 0 :(得分:2)
使用@MappedSuperclass
(cf here):
@MappedSuperclass
public class CommonThing {
@Column(name = "INSERT_TIME")
private Date insertTime;
@Column(name = "UPDATE_TIME")
private Date updateTime;
@PrePersist
protected void onCreate() {
insertTime = new Date();
}
@PreUpdate
protected void onUpdate() {
updateTime = new Date();
}
}
然后:
@Entity
public class Thing extends CommonThing {
// Other columns.
}
在文档API中,@MappedSuperclass
还会处理注释,例如@PrePersist
。
答案 1 :(得分:1)
我并非100%确定生命周期方法可行,但您可以尝试使用Embeddable
s:
@Embeddable
public class Trace {
@Column(name = "INSERT_TIME")
private Date insertTime;
@Column(name = "UPDATE_TIME")
private Date updateTime;
@PrePersist
protected void onCreate() {
insertTime = new Date();
}
@PreUpdate
protected void onUpdate() {
updateTime = new Date();
}
}
@Entity
public class Thing {
@Embedded
private Trace trace;
//more stuff
}
@Entity
public class OtherThing {
@Embedded
private Trace trace;
//other stuff
}
这样你就不需要为你的entites引入一个单独的超类。与使用此table
的任何Entity
相对应的embeddable
需要定义列INSERT_TIME
和UPDATE_TIME
。如果需要,您可以使用@AttributeOverride
覆盖这些列名称。