我正在使用Camel和JPA将实体持久化到Postgres数据库。在每个实体中,我有一个名为“history”的字段,其中包含给定实体的所有旧值。我正在寻找一种在每次更新操作之前自动填充此字段的方法。 浏览网页,我发现了JPA拦截器,但我发现它们用于审计/记录目的。我错了吗? 最好的方法是什么?
答案 0 :(得分:1)
JPA / Hibernate拦截器(一个取决于你正在使用的版本)是一种方法。审计/日志记录与您想要执行的操作类似,即在实体本身更新时自动更新某些列/属性(任何属性)。请注意,手动更新查询会绕过这些拦截器,因此应该避免这些拦截器。
如何使用这些拦截器取决于您希望如何实现该历史记录功能。如果您通过生成一些字符串/字节表示并将其存储在列中来完成它,它应该可以工作。如果您计划创建另一个实体等,则可能必须在拦截器中收集更改/旧值,并在成功提交后存储收集的值。 AFAIK在调用拦截器时创建新实体是不可能的(至少不容易)。
答案 1 :(得分:0)
@Entity
@Table(name = "entities")
public class Entity {
...
private Date created;
private Date updated;
@PrePersist
protected void onCreate() {
created = new Date();
}
@PreUpdate
protected void onUpdate() {
updated = new Date();
}
}
答案 2 :(得分:0)
您可以使用@EntityListeners
并向其提供实体Listener类,您也可以随时重复使用
在您的实体Listener类中,您可以使用@PrePersit, @PostPersist, @PreUpdate, @PostUpdate, @PreDelete, @PostDelete
注释提供回调方法。这些方法将自动调用它们各自的动作。