为什么 Hibernate Envers 将 Last_Edited_By 列值替换为 "API"

Why Hibernate Envers is replacing Last_Edited_By column value to "API"

我有class这样的结构:

@Entity
@Data
@Table(name="person_dtl")
@Audited
@AuditTable(value="h$person_dtl")
public class Person extends AuditBaseEntity implements Serializable {

     @Id
      @Column(name="person_ID", nullable = false)
      private String personID;
      
      @Column(name="person_Name", nullable = false)
      private String personName;

}

@Audited
@MappedSuperClass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditBaseEntity extends BaseEntity {
    
    
    @Column(name = "created_by", nullable = false, updatable = false)
    @CreatedBy
    protected String createdBy;

    @Column(name = "last_modified_by")
    @LastModifiedBy
    private String lastModifiedBy;
    
    @Column(name = "created_date", nullable = false, updatable = false)
    @CreatedDate
    protected Date createdDate;

    @Column(name = "last_modified_date")
    @LastModifiedDate
    private Date lastModifiedDate;
    
    @PrePersist
    public void onPrePersist() {
        this.activeIndicator="A";
    }
     
    @PreRemove
    public void onPreRemove() {
        this.activeIndicator="I";
    }
}

@Audited
@MappedSuperClass
public abstract class BaseEntity {
    
    @Column(name = "active_ind", nullable = false)
    @CreatedBy
    protected String activeIndicator;
}

我一直在使用 hibernate envers 在我的 spring-boot 应用程序中进行审计。我在 pom.xml 中包含了 spring-data-jpaenvers 依赖项。我明确地将 createdBylastModifiedBy 列的值设置为用户的 ID,但是每当插入发生时 createdBylastModifiedBy 列值都被设置为“API " 在我们的 Oracle 数据库中的 table 中。此外,无论何时我执行更新 lastModifiedBy 列值都被设置为“API”,即使我已经在我的实体中设置了 userid。为什么会这样?我是否遗漏了一些 属性 值?

由于您使用的是 Spring 数据,因此用 @CreatedBy @LastModifiedBy 注释的实体将由当前登录的用户填充。 您可以覆盖此行为并告诉 Spring 每当您在数据库中插入新记录时存储当前用户 ID。为此,您需要提供 AuditorAware 接口的实现并覆盖 getCurrentAuditor() 方法。在 getCurrentAuditor() 中,您需要获取当前登录用户的 ID。

 @Component
    public class SpringSecurityAuditorAware implements AuditorAware<String> {
    
        @Override
        public String getCurrentAuditor() {
           Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
MyUserDetails customUser = (MyUserDetails)authentication.getPrincipal();
int userId = customUser.getUserId();
     return String.valueOf(userId);
        }
    }