首页 > 解决方案 > 克隆 JPA 实体,包括用 spring 的 createdBy 注释的值

问题描述

我有以下超类(抽象)

public abstract class AbstractAuditEntity {
  @CreatedBy
  private String createdBy;
}

我的数据库中有几个对象。现在我想要一种方法来克隆特定对象及其所有属性,包括 createdBy。我可以将任何字符串设置为此值,但在将其持久化到数据库之前,该值会重置为当前经过身份验证的用户名。

如何防止 spring/jpa 在已填充时覆盖我的 createdBy 字段?

提前致谢!

标签: javaspringjpaaudit

解决方案


不幸的是,这似乎是不可能的。

在 AuditingEntityListener 中,@PrePersist 方法如下所示:

@PrePersist
public void touchForCreate(Object target) {

    Assert.notNull(target, "Entity must not be null!");

    if (handler != null) {

        AuditingHandler object = handler.getObject();
        if (object != null) {
            object.markCreated(target);
        }
    }
}

然后是 AuditingHandler:

public <T> T markCreated(T source) {

    Assert.notNull(source, "Entity must not be null!");

    return touch(source, true);
}

由于第二个参数为真,它将始终设置 createdBy 字段:

private Optional<Object> touchAuditor(AuditableBeanWrapper<?> wrapper, boolean isNew) {

    Assert.notNull(wrapper, "AuditableBeanWrapper must not be null!");

    return auditorAware.map(it -> {

        Optional<?> auditor = it.getCurrentAuditor();

        Assert.notNull(auditor,
                () -> String.format("Auditor must not be null! Returned by: %s!", AopUtils.getTargetClass(it)));

        auditor.filter(__ -> isNew).ifPresent(foo -> wrapper.setCreatedBy(foo));
        auditor.filter(__ -> !isNew || modifyOnCreation).ifPresent(foo -> wrapper.setLastModifiedBy(foo));

        return auditor;
    });
}

但由于这似乎是一个有趣的功能,您应该继续并打开未来的请求: https ://jira.spring.io/projects/DATAJPA/issues/DATAJPA-1397?filter=allopenissues


推荐阅读