JPA 审计 LastModifiedBy/LastModifiedDate 在事务方法中被访问时为空
Posted
技术标签:
【中文标题】JPA 审计 LastModifiedBy/LastModifiedDate 在事务方法中被访问时为空【英文标题】:JPA Auditing LastModifiedBy/LastModifiedDate are null when being accessed in the transaction method 【发布时间】:2019-06-17 09:36:57 【问题描述】:我的审核设置如下所示,它们运行良好。问题是当我想在更新之前在事务方法中访问它们时,更新 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;
【问题讨论】:
【参考方案1】:Spring Data JPA 的审计功能基于 JPA 生命周期事件,the event PreUpdate
used to set the last-modified columns 仅在 JPA 实现实际更新数据库时触发,在许多情况下是在事务结束时。
请参阅JPA specification 的第 3.5.3 节:
PreUpdate 和 PostUpdate 回调分别发生在对实体数据进行数据库更新操作之前和之后。这些数据库操作可能在实体状态更新时发生,也可能在状态刷新到数据库时发生(可能在事务结束时)。
因此,如果您希望设置这些值,则需要刷新持久性上下文。
【讨论】:
这基本上是我的假设,但找不到您链接的信息来自己确认。谢谢!如果我在事务期间刷新上下文会导致@Transactional 出现任何问题吗?我正在尝试发送数据以进行一些额外的验证,因此目标是让该验证成为交易的一部分。 事务期间刷新不应干扰@Transactional
。以上是关于JPA 审计 LastModifiedBy/LastModifiedDate 在事务方法中被访问时为空的主要内容,如果未能解决你的问题,请参考以下文章