Home > Enterprise >  Why Hibernate Envers is replacing Last_Edited_By column value to "API"
Why Hibernate Envers is replacing Last_Edited_By column value to "API"

Time:05-31

I have class structure something like:

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

I've been using hibernate envers to for auditing purpose in my spring-boot app. I have included spring-data-jpa and envers dependency in pom. I am explicitly setting values of createdBy and lastModifiedBy columns to user's id but whenever the insert is happening createdBy and lastModifiedBy column values are being set to "API" in the table in our Oracle DB. Also whenever I am performing update lastModifiedBy column value is being set to "API" even though I have set userid in my entity. Why is this happening? Am I missing some property value?

CodePudding user response:

Since you are using Spring Data, entities annotated with @CreatedBy @LastModifiedBy are going to be populated with the currently logged user. You can override this behaviour and tell Spring to store current user id whenever you insert new record in database. To achieve that you will need to provide an implementation of AuditorAware interface and override getCurrentAuditor() method. Inside getCurrentAuditor() you will need to fetch currently logged in user 's 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);
        }
    }
  • Related