繁体   English   中英

JPA /休眠:如何在实体更新时自动更新字段

[英]JPA/Hibernate: how to automatically update fields on entity update

我正在使用Camel和JPA将实体持久保存到Postgres DB。 在每个实体中,我都有一个称为“历史”的字段,其中包含给定实体的所有旧值。 我正在寻找一种在每次更新操作之前自动填充此字段的方法。 在网上冲浪时,我发现了JPA拦截器,但我发现它们用于审计/记录目的。 我错了吗? 最好的方法是什么?

JPA / Hibernate拦截器(取决于您使用的版本)是执行此操作的一种方法。 审核/记录与您要执行的操作类似,即在更新实体本身(任何属性)时自动更新某些列/属性。 请注意,手动更新查询会绕过这些拦截器,因此应避免使用这些拦截器。

但是,如何使用这些拦截器取决于您要如何实现该历史记录功能。 如果通过生成一些字符串/字节表示形式并将其存储在列中来完成此操作,则它应该可以工作。 如果您打算创建另一个实体等,则可能必须在拦截器中收集更改/旧值,并在成功提交后存储收集的值。 AFAIK当拦截器被调用时,不可能(至少不容易)创建一个新实体。

@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();
  }
}

您可以使用@EntityListeners并为其提供实体Listener类,也可以在需要时重用它

在您的实体侦听器类中,可以为回调方法提供@PrePersit, @PostPersist, @PreUpdate, @PostUpdate, @PreDelete, @PostDelete批注。 这些方法将针对其各自的动作自动调用。

您可以阅读Spring Data JPA Auditing:自动保存CreatedBy,CreatedDate,LastModifiedBy,LastModifiedDate以获得更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM