【问题标题】:Hibernate envers how to add fields to audit tableHibernate envers如何向审计表添加字段
【发布时间】:2018-12-28 19:37:45
【问题描述】:

我想要将@ModifiedBy@LastModifiedDate@CreatedByCreatedDate 保存到所有审计表中。让事情变得困难的是我不想在我的@Entity POJO 中有这些字段。如果可能的话,怎么能做到这一点?

【问题讨论】:

    标签: java spring spring-data-jpa audit hibernate-envers


    【解决方案1】:

    是的,但实现与您所说的略有不同。

    在实际审计行本身中引入这些内容的问题在于,您可能会面临大量非规范化数据分散在审计架构中的风险,尤其是当您考虑到一个审计修订可以包含多个实体这一事实时.

    完成您所描述的 Envers 方法是分别处理各个部分。

    为了捕获执行审计操作的人员,最好的方法是扩展或提供您自己的修订实体实现。在此实体中,您将包含一个用于存储用户名或您想要的任何用户标识值的列。

    为了在该实体中填充用户名或标识值,您还需要编写自定义 RevisionListener 并在修订实体的 @RevisionEntity 注释上指定它。您可以在用户文档here 中找到示例。

    为了获取修订的时间戳,您不仅需要获取实体,还需要获取该审计行的修订实体。这样,您不仅可以获得修订发生的时间戳、进行更改的自定义字段,还可以获得修订的类型(ADD、MOD、DEL),这样您就可以根据您的值进行分支重读是 Creation vs Modification 角色。

    【讨论】:

      【解决方案2】:

      据我所知,您只是不希望在 POJO 类中创建这些字段,因此您可以创建一个 @MappedSuperclass 包含与审计相关的字段,并且您可以扩展稍后对所有实体类。 例如,在这里,我正在创建一个名为 Auditable 的抽象类,它将扩展到所有实体类。

      @MappedSuperclass
      @EntityListeners(AuditingEntityListener.class)
      abstract class Auditable<User> {
      
      
      @CreatedBy
      @Column(nullable = false, updatable = false)
      private String createdBy;
      
      @CreatedDate
      @Column(nullable = false, updatable = false)
      private LocalDateTime created;
      
      @LastModifiedBy
      @Column(nullable = false)
      private String modifiedBy;
      
      @LastModifiedDate
      @Column(nullable = false)
      private LocalDateTime modified;
      
      
      
      @Column(nullable = false)
      @NotBlank(message = "username is required")
      private String username;
      
      
      public String getUsername() {
          return username;
      }
      
      public void setUsername(String username) {
          this.username = username;
      }
      
      public LocalDateTime getCreated() {
          return created;
      }
      
      public LocalDateTime getModified() {
          return modified;
      }
      
      public String getCreatedBy() {
          return createdBy;
      }
      
      public String getModifiedBy() {
          return modifiedBy;
      }
      }
      

      在此之后,您可以轻松地在所有实体类中使用它,因为这是一个超类,您可以在所有实体中使用它。例如,我正在创建一个名为 Employee 的实体,我希望在其中设置可审计字段

      @Entity
      @Table
      @EntityListeners(AuditingEntityListener.class)
      public class Employee extends Auditable<String>{
      
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Integer id ;
      
      @Column(nullable = false)
      private String empName ;
      
      @Column(nullable = false)
      private String department ;
      
      @Column(nullable = false)
      private Integer age ;
      
      
      
      
      public Integer getAge() {
          return age;
      }
      
      public void setAge(Integer age) {
          this.age = age;
      }
      
      public String getDepartment() {
          return department;
      }
      
      public void setDepartment(String department) {
          this.department = department;
      }
      
      public String getEmpName() {
          return empName;
      }
      
      public void setEmpName(String empName) {
          this.empName = empName;
      }
      
      public Integer getId() {
          return id;
      }
      
      public void setId(Integer id) {
          this.id = id;
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-02
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 2015-08-20
        • 1970-01-01
        • 2015-12-14
        • 2019-01-22
        相关资源
        最近更新 更多