为什么 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-jpa
和 envers
依赖项。我明确地将 createdBy
和 lastModifiedBy
列的值设置为用户的 ID,但是每当插入发生时 createdBy
和 lastModifiedBy
列值都被设置为“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);
}
}
我有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-jpa
和 envers
依赖项。我明确地将 createdBy
和 lastModifiedBy
列的值设置为用户的 ID,但是每当插入发生时 createdBy
和 lastModifiedBy
列值都被设置为“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);
}
}