java - JPA 审计 LastModifiedBy/LastModifiedDate 在事务方法中被访问时为空
问题描述
我的审计设置如下所示,它们工作正常。问题是当我想在更新之前在事务方法中访问它们时,更新 id/date 始终为空,我不知道为什么。
@CreatedBy
@Column(name = "CREATE_ID", updatable = false, nullable = false)
private String createId;
@LastModifiedBy
@Column(name = "UPDATE_ID", nullable = false)
private String updateId;
@CreatedDate
@Column(name = "CREATE_DATE", updatable = false, nullable = false)
private Date createDate;
@LastModifiedDate
@Column(name = "UPDATE_DATE", nullable = false)
private Date updateDate;
调用保存的创建/更新方法。
注意:这两个都可以正常工作,使用正确的创建/更新审计值在数据库中创建/更新记录。问题是我无法在更新方法中访问更新 ID/日期,我不确定为什么/如何修复它。
@Override
@Transactional
public MyObj create(MyObj myObj) {
MyObj createdMyObj = myObjRepo.save(myObj);
System.out.println(createdMyObj.getCreateId()); // This works fine
return createdMyObj;
}
@Override
@Transactional
public MyObj update(MyObj myObj) {
MyObj updatedMyObj = myObjRepo.save(myObj);
System.out.println(updatedMyObj.getUpdateId()); // This is null
return updatedMyObj;
}
解决方案
Spring Data JPA 的审计功能基于 JPA 生命周期事件,用于设置最后修改列的事件PreUpdate
仅在 JPA 实现实际更新数据库时触发,在许多情况下是在事务结束时。
请参阅JPA 规范的第 3.5.3 节:
PreUpdate 和 PostUpdate 回调分别发生在对实体数据进行数据库更新操作之前和之后。这些数据库操作可能发生在实体状态更新时,也可能发生在状态刷新到数据库时(可能在事务结束时)。
因此,如果要设置这些值,则需要刷新持久性上下文。
推荐阅读
- javascript - TypeError: undefined is not an object (评估 XYZ)
- python - 我想在 Simpy Python 中从 FilterStore 中获取许多项目
- reactjs - 如何使用样式组件设置 React FontAwesome 图标的样式?
- api - ProctorU api:如何过滤一所学校 ProctorU 上的活动考试列表?
- android - 如何使用 targetSdk 11 从 android 编辑文件 mp3/audio...
- reactjs - 有对象值但反应说未定义反应还原
- mysql - mysql 8.0中纬度和经度的数据类型
- c - 释放结构指针的特定元素 - C
- javascript - 使用js更改单选按钮时更改单选按钮的值和id
- javascript - 使用 Rxjs 进行优化