java - 审计实体 JPA 中的更改

标签 java spring jpa

我有 Spring MVC + JPA 应用程序。

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

谢谢

最佳答案

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

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

Spring提供@CreatedBy @LastModifiedBy @CreatedDate@LastModifiedDate注释,其中您需要提供使用 AuditorAware 进行更新的用户名 bean 。

要启用审核,

  1. 应添加@EnableJpaAuditing关于配置类
  2. @Audited@EntityListeners(AuditingEntityListener.class)关于实体
  3. AuditorAware<T>提供用户名
  4. 子实体应使用 @Audited 进行注释

示例

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

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

  1. {ENTITY_NAME}_AUD//可以覆盖审计表名的前缀和后缀
  2. 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/

相关文章:

java - JComboBox 像 HTML select 一样提交值

java - 排序字母数字字符串java

java - 如何使用 Spring 4 注入(inject)键值映射?

hibernate - 使用 updatable=false 更新实体将字段设置为 null

java - Compose 解决来自 IBM 云应用程序的 RabbitMq 连接问题

javascript - 在 JSP 中通过 JavaScript 访问 ModelMap 列表

spring - 写入时保险库错误

java - 日期列,默认日期包含小时和分钟

jpa - NoResultException : getSingleResult() did not retrieve any entities. QueryImpl. throwNoResultException

java - 刷新 JTable 会删除标题