我有 Spring MVC + JPA 应用程序。
我的应用程序中有几个实体在不断变化。我希望能够审核此更改。我发现有一个 @Audited
注释可以跟踪某些字段或整个实体的更改。我想知道是否有任何方法可以配置此跟踪选项 - 我希望能够跟踪更改的内容以及更改者。此外,是否可以从 SQL 中的 1 个表中的多个实体进行更改?还可以跟踪实体中的 - @OneToMany
字段的更改吗?
谢谢
最佳答案
是的,您可以跟踪所做的更改、更新的用户和时间戳。
Hibernate 提供 @Audited
用于维护实体版本的注释。
Spring提供@CreatedBy
@LastModifiedBy
@CreatedDate
和@LastModifiedDate
注释,其中您需要提供使用 AuditorAware
进行更新的用户名 bean 。
要启用审核,
- 应添加
@EnableJpaAuditing
关于配置类 -
@Audited
和@EntityListeners(AuditingEntityListener.class)
关于实体 -
AuditorAware<T>
提供用户名 - 子实体应使用
@Audited
进行注释
示例
@Bean
public AuditorAware<String> createAuditorProvider() {
return () -> "username"; // should be from context/session
}
对于每个实体,将创建一个附加表来维护版本
-
{ENTITY_NAME}_AUD
//可以覆盖审计表名的前缀和后缀 -
REVINFO
下面是一个与 Hibernate 和 Spring 审核的一对多关系的示例
用户信息.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;
}
用户地址.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;
}
关于java - 审计实体 JPA 中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161180/