审核实体JPA中的更改

Ira*_*kli 2 java spring jpa

我有Spring MVC + JPA应用程序.

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

谢谢

Sar*_*ana 6

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

Hibernate提供了@Audited用于维护实体版本的注释.

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

要启用审核,

  1. 应该添加@EnableJpaAuditing配置类
  2. @Audited@EntityListeners(AuditingEntityListener.class)实体
  3. AuditorAware<T> 提供用户名
  4. 儿童实体应注明 @Audited

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

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

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

下面是一个与hibernate和spring审计的一对多关系的例子

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;

}
Run Code Online (Sandbox Code Playgroud)

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;

}
Run Code Online (Sandbox Code Playgroud)

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;

}
Run Code Online (Sandbox Code Playgroud)