java - 克隆 JPA 实体,包括用 spring 的 createdBy 注释的值
问题描述
我有以下超类(抽象)
public abstract class AbstractAuditEntity {
@CreatedBy
private String createdBy;
}
我的数据库中有几个对象。现在我想要一种方法来克隆特定对象及其所有属性,包括 createdBy。我可以将任何字符串设置为此值,但在将其持久化到数据库之前,该值会重置为当前经过身份验证的用户名。
如何防止 spring/jpa 在已填充时覆盖我的 createdBy 字段?
提前致谢!
解决方案
不幸的是,这似乎是不可能的。
在 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
推荐阅读
- php - PHP后端验证电话号码
- javascript - React App 和 Chrome DevTools 本地覆盖不起作用
- docker - Linux容器:临时阻止本地端口的命令?
- google-cloud-platform - 通过 Java API 获取 GCS 磁盘使用信息?
- java - Mqtt Paho 客户端使用 RabbitMQ 为每个客户端创建 2 个通道
- python - 将函数传递给装饰器
- r - 我的 testthat 测试通过了 devtools::test() 检查,但在开发 R 包时未通过 devtools::check() 步骤
- c++ - 犰狳库和未定义的行为
- html - 文件选择框在 android 移动浏览器中显示输入类型文件标记的其他文件
- ag-grid - 如何在一行上禁用行组扩展功能?