JPA / Hibernate:如何自动更新实体更新中的字段

时间:2015-11-30 09:08:51

标签: java hibernate jpa

我正在使用Camel和JPA将实体持久化到Postgres数据库。在每个实体中,我有一个名为“history”的字段,其中包含给定实体的所有旧值。我正在寻找一种在每次更新操作之前自动填充此字段的方法。 浏览网页,我发现了JPA拦截器,但我发现它们用于审计/记录目的。我错了吗? 最好的方法是什么?

3 个答案:

答案 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注释提供回调方法。这些方法将自动调用它们各自的动作。

您可以阅读Spring Data JPA Auditing: Saving CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate automatically了解详情。