克隆JPA实体,包括带有spring的createdBy注释的值

时间:2018-08-14 10:37:50

标签: java spring jpa audit

我有以下超级课程(摘要)

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

不幸的是,这种缝隙是不可能的。

在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);
}

由于第二个参数为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

答案 1 :(得分:0)

我为DataJPA创建了功能请求,但我不知道它何时得到解决。

在此之前,我先保存实体,然后使用本机SQL更改createdBy。我不会将其标记为可接受的答案。

updated = existing.append(gd.get_as_dataframe(another_sheet))

Source DataJPA-Request