在事务方法中访问JPA审核LastModifiedBy / LastModifiedDate时为null

时间:2019-01-23 18:14:37

标签: java jpa spring-data-jpa audit

我的审核设置如下所示,并且工作正常。问题是,当我想在更新之前使用事务方法访问它们时,更新ID /日期始终为null,并且不确定为什么。

@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;

正在调用保存的创建/更新方法。

注意:这两种方法都可以正常工作,可以使用正确的创建/更新审核值在数据库中创建/更新记录。问题是我无法在update方法中访问更新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 个答案:

答案 0 :(得分:1)

Spring Data JPA的审计功能基于JPA生命周期事件,the event PreUpdate used to set the last-modified columns仅在JPA实现实际更新数据库时才触发,而在许多情况下,这是在事务结束时进行的。

请参见JPA specification的第3.5.3节:

  

PreUpdate和PostUpdate回调分别在对实体数据进行数据库更新操作之前和之后发生。这些数据库操作可能在实体状态更新时发生,或者可能在状态刷新到数据库时发生(可能在事务结束时发生)。

因此,如果要设置这些值,则需要刷新持久性上下文。