java - 带有 @MappedSuperclass 的自定义 AuditorAware getCurrentAuditor

标签 java spring-boot spring-data

我正在尝试将自定义值加载到我的 AuditFields 实体中的 @CreatedBy 字段中。每当我发出 POST 请求时,我都希望 Spring Data Rest 使用此 AuditorAwareImpl 并将 TestPrincipal 字符串传递给 @CreatedBy 字段。

我实际得到的结果是409 Conflict, SQL Constraint created_by is null

BaseEntity 需要使用 @MappedSuperclass 但我认为它需要 @Entity 的功能才能将值传递给 @CreatedBy

如果有任何指点,我们将不胜感激。

审计实体

@Embeddable
@Access(AccessType.FIELD)
@Data
@EntityListeners(AuditingEntityListener.class)
public class AuditFields implements Serializable {

    @CreatedBy
    @Column(name="CREATED_BY", length=256)
    private String createdBy; 

    @Column(name="CREATED_TIMESTAMP")
    private LocalDateTime createTimestamp = LocalDateTime.now();

    ...
    ...

}

基础实体

@MappedSuperclass
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class BaseEntity implements Serializable {

    @Column(name="RECORD_STATUS_CODE", length=1)
    @EqualsAndHashCode.Exclude
    private String myStatus;

    @Version
    @Column(name="VERSION_NUMBER")
    @Setter(AccessLevel.PROTECTED)
    @EqualsAndHashCode.Exclude
    private Long versionNumber;

    @Embedded
    @EqualsAndHashCode.Exclude
    private AuditEntity auditFields;
}

AuditorAwareImpl

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class AuditorAwareImpl {

    @Bean
    public AuditorAware<String> auditorProvider() {
        return new AuditorAware<String>() {
            @Override
            public Optional<String> getCurrentAuditor() {
                return Optional.of("TestPrincipal");
            }
        };
    }
}

最佳答案

这里的技巧是,如果没有一些额外的工作,@CreatedBy 无法在 @Embedded 实体中工作。

我拼凑了一些不同的教程,结果是我将 @EntityListener 放入我的 MyEntity 中,并编写了一个使用 @PrePost 的自定义监听器类。然后,您可以通过添加嵌入 AuditEntity 等的 BaseEntity 来进一步构建它。

审计实体

@Embeddable
@Data
public class AuditEntity {
    @Column(name="CREATED_BY")
    @CreatedBy
    private String createdBy;

    // additional fields ...

}

MyEntity

@Data
@Table(name="TABLENAME", schema="SCHEMANAME")
@EntityListeners(CustomAuditListener.class)
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="MY_ID")
    private Long myId;

    @Embedded
    @EqualsAndHashCode.Exclude
    private AuditEntity auditFields;
}

自定义审计监听器

public class CustomAuditListener {
    @PrePersist
    public void prePersist(Object obj) {
        MyEntity entity = (MyEntity) obj;
        AuditFields audit = new AuditFields();
        audit.setCreatedBy("CreatedByValueHere")        
        entity.setAuditFields(audit);
    }

    // can add @PreUpdate, etc, here  

}

关于java - 带有 @MappedSuperclass 的自定义 AuditorAware getCurrentAuditor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56939296/

相关文章:

java - BadSqlGrammarException :Caused by: java. sql.SQLException:列名无效

java - 对 AWS EC2/EBS 资源使用较长的 ID

java - 包含带有列表的查询的 jpa

java - 无法在 Spring 服务中使用 ReposiotryResource 端点

java - Spring Boot JPA 获取对 EntityManagerFactory 的引用

java - 如何使用 Spring 缓存管理器与 redis 1.6.2.RELEASE

java - Spring Boot 获取列

java - Hibernate 5 没有 FieldHandled 类

spring-data - spring data如何根据方法名生成sql?

spring - elasticSearch从其他表索引