审核实体JPA中的更改
我有Spring MVC + JPA应用程序。
我有几个实体正在不断变化。 我希望能够审核这些变化。 我发现有一个@Audited
注释跟踪某些字段或整个实体的更改。 我想知道是否有任何方法可以配置此跟踪选项 – 我希望能够跟踪更改的内容以及更改者。还可以从SQL中的1个表中的多个实体进行更改吗? 还可以跟踪实体中@OneToMany
字段的变化吗?
谢谢
是的,您可以跟踪所做的更改,更新的用户和时间戳。
Hibernate提供@Audited
注释来维护实体版本。
Spring提供@CreatedBy
@LastModifiedBy
@CreatedDate
和@LastModifiedDate
注释,其中您需要提供使用AuditorAware
bean更新的用户名。
要启用审核,
- 应该在配置类上添加
@EnableJpaAuditing
- 实体上的
@Audited
和@EntityListeners(AuditingEntityListener.class)
-
AuditorAware
提供用户名 - 儿童实体应注明
@Audited
例
@Bean public AuditorAware createAuditorProvider() { return () -> "username"; // should be from context/session }
对于每个实体,将创建另一个表来维护版本
-
{ENTITY_NAME}_AUD
//可以覆盖审核表名称的前缀和后缀 -
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 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; }