【问题标题】:Auditing Changes in Entity JPA审计实体 JPA 中的更改
【发布时间】:2016-07-02 14:24:46
【问题描述】:

我有 Spring MVC + JPA 应用程序。

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

谢谢

【问题讨论】:

    标签: java spring jpa


    【解决方案1】:

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

    Hibernate 提供@Audited 注解来维护实体版本。

    Spring提供@CreatedBy@LastModifiedBy@CreatedDate@LastModifiedDate注解,其中需要提供使用AuditorAwarebean更新的用户名。

    要启用审核,

    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;
    
    }
    

    【讨论】:

    • 我可以同时使用 Hibernate JPA 和 Spring data JPA 吗?我无法识别@EnableJpaAuditing。我需要为此导入什么库?
    • spring-data-jpahibernate-jpahibernate-envers
    • 您好我来晚了,请问这些表是如何创建的?
    • @Vipul 如果它是 Spring Boot 项目,您可以使用 spring.jpa.hibernate.ddl-auto=create 创建表
    • 这是一个糟糕的例子。这是为了版本控制而不是审核 OP 的要求
    猜你喜欢
    • 2017-01-13
    • 2022-06-30
    • 2014-12-08
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2015-12-14
    • 2019-10-18
    相关资源
    最近更新 更多