审核实体JPA中的更改

时间:2016-07-02 14:24:46

标签: java spring jpa

我有Spring MVC + JPA应用程序。

我在应用程序中有几个实体在不断变化。我希望能够审核这些变化。我发现有@Audited注释跟踪某些字段或整个实体的更改。我想知道是否有任何方法可以配置此跟踪选项 - 我希望能够跟踪更改内容以及更改者。还可以从SQL中的1个表中的多个实体进行更改吗?还可以跟踪实体中的@OneToMany字段的变化吗?

由于

1 个答案:

答案 0 :(得分:6)

是的,您可以跟踪所做的更改,更新的用户和时间戳。

Hibernate提供@Audited注释来维护实体版本。

Spring提供@CreatedBy @LastModifiedBy @CreatedDate@LastModifiedDate注释,其中您需要提供使用AuditorAware bean更新的用户名。

启用审核

  1. 应在配置类
  2. 上添加@EnableJpaAuditing 实体
  3. @Audited@EntityListeners(AuditingEntityListener.class)
  4. AuditorAware<T>提供用户名
  5. 儿童实体应使用@Audited
  6. 进行注释

    实施例

    @Bean
    public AuditorAware<String> createAuditorProvider() {
        return () -> "username"; // should be from context/session
    }
    

    对于每个实体,将创建一个附加表来维护版本

    1. {ENTITY_NAME}_AUD //可以覆盖审计表名称的前缀和后缀
    2. REVINFO
    3. 下面的

      是一个与休眠和弹簧审核的一对多关系的例子

      UserInfo.java

      @Audited
      @Entity
      @EntityListeners(AuditingEntityListener.class)
      public class UserInfo extends AuditInfo {
      
          @Id
          @GeneratedValue
          private Long id;
      
          @Column
          private String name;
      
          @OneToMany(mappedBy = "userInfo", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
          private List<UserAddress> addresses;
      
      }
      

      UserAddress.java

      @Entity
      @Audited
      @EntityListeners(AuditingEntityListener.class)
      public class UserAddress extends AuditInfo {
      
          @Id
          @GeneratedValue
          private Long addressId;
      
          @ManyToOne
          @JoinColumn(name = "id", nullable = false)
          private UserInfo userInfo;
      
          @Column
          private Long no;
      
          @Column
          private String street;
      
      }
      

      AuditInfo.java

      @EntityListeners(AuditingEntityListener.class)
      @MappedSuperclass
      public abstract class AuditInfo {
      
          @CreatedBy
          private String createdBy;
      
          @LastModifiedBy
          private String updatedBy;
      
          @CreatedDate
          private LocalDateTime createdOn;
      
          @LastModifiedDate
          private LocalDateTime updatedOn;
      
      }