我有Spring MVC + JPA应用程序。
我在应用程序中有几个实体在不断变化。我希望能够审核这些变化。我发现有@Audited
注释跟踪某些字段或整个实体的更改。我想知道是否有任何方法可以配置此跟踪选项 - 我希望能够跟踪更改内容以及更改者。还可以从SQL中的1个表中的多个实体进行更改吗?还可以跟踪实体中的@OneToMany
字段的变化吗?
由于
答案 0 :(得分:6)
是的,您可以跟踪所做的更改,更新的用户和时间戳。
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
是一个与休眠和弹簧审核的一对多关系的例子
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;
}