【发布时间】:2016-07-02 14:24:46
【问题描述】:
我有 Spring MVC + JPA 应用程序。
我在应用程序中有几个不断变化的实体。我希望能够审核这些更改。我发现有一个@Audited 注释可以跟踪对某些字段或整个实体的更改。我想知道是否有任何方法可以配置此跟踪选项 - 我希望能够跟踪更改的内容以及更改的人员。还可以从 SQL 中的 1 个表中的多个实体进行更改吗?是否可以跟踪实体中的 - @OneToMany 字段的变化?
谢谢
【问题讨论】:
我有 Spring MVC + JPA 应用程序。
我在应用程序中有几个不断变化的实体。我希望能够审核这些更改。我发现有一个@Audited 注释可以跟踪对某些字段或整个实体的更改。我想知道是否有任何方法可以配置此跟踪选项 - 我希望能够跟踪更改的内容以及更改的人员。还可以从 SQL 中的 1 个表中的多个实体进行更改吗?是否可以跟踪实体中的 - @OneToMany 字段的变化?
谢谢
【问题讨论】:
是的,您可以跟踪所做的更改、更新的用户和时间戳。
Hibernate 提供@Audited 注解来维护实体版本。
Spring提供@CreatedBy@LastModifiedBy@CreatedDate和@LastModifiedDate注解,其中需要提供使用AuditorAwarebean更新的用户名。
要启用审核,
@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;
}
【讨论】:
spring-data-jpa、hibernate-jpa 和 hibernate-envers
spring.jpa.hibernate.ddl-auto=create 创建表