如何覆盖JPA Audit中@CreatedBy注解的值

问题描述 投票:0回答:1

我想做一个功能,可以自动监控和更新createdBy、modifiedBy、createdAt、modifiedAt。我决定选择使用 JPA AuditingEntityListener。但是,在某些情况下,我想手动设置createdBy和modifiedBy,但它不起作用。我该怎么办?

实体:

@Data
@SuperBuilder
@EntityListeners({AuditingEntityListener.class})
public abstract class BaseEntity {

    @CreatedDate
    @Column(nullable = false, updatable = true)
    private LocalDateTime createdDate;

    @LastModifiedDate
    @Column(nullable = false)
    private LocalDateTime modifiedDate;

    @CreatedBy
    @Column(nullable = false, updatable = true)
    private Integer createdBy;

    @LastModifiedBy
    @Column(nullable = false)
    private Integer modifiedBy;

    @Column(nullable = false)
    private Boolean deleteFlag = false;
}

AuditAwareConfig:

@Component
public class ApplicationAuditAware implements AuditorAware<Integer>{
    @Override
    public Optional<Integer> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) {
            return Optional.of(0);
        }
        User user = (User) authentication.getPrincipal();
        return Optional.of(user.getId());
    }
}

我想使用

entity.setCreatedBy('John')
而不是使用 AuditingEntityListener.class。

java spring-boot spring-mvc jpa spring-data-jpa
1个回答
0
投票

您可以尝试以下策略

  • 引入一个新的布尔字段,您将根据该字段决定必须手动还是自动设置审核值。
  • 新字段将是@Transient,这将表明该字段不被持久化。
  • 编写一个 CustomAuditingEntityListener 来扩展 AuditingListener 类。
  • 在自定义侦听器中,您可以根据您的要求重写 touhForCreate 和 touchForUpdate 方法。
© www.soinside.com 2019 - 2024. All rights reserved.