我有以下超级课程(摘要)
public abstract class AbstractAuditEntity {
@CreatedBy
private String createdBy;
}
我的数据库中有几个对象。现在,我需要一种方法来克隆特定对象及其所有属性,包括createdBy。我可以将任何String设置为此值,但是在将其持久化到数据库之前,该值将重置为当前经过身份验证的用户名。
如何防止spring / jpa在我的createdBy字段已被填充时覆盖它?
谢谢!
答案 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))