Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA审核LastModifiedBy/LastModifiedDate在事务方法中被访问时为空_Java_Jpa_Spring Data Jpa_Audit - Fatal编程技术网

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

Java JPA审核LastModifiedBy/LastModifiedDate在事务方法中被访问时为空,java,jpa,spring-data-jpa,audit,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 upda

我有我的审计设置如下所示,他们工作良好。问题是,当我想在更新之前在事务方法中访问它们时,更新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;
调用save的create/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;
}

SpringDataJPA的审计功能基于JPA生命周期事件,只有当JPA实现实际更新数据库时才会触发,在许多情况下,数据库是在事务结束时触发的

见本手册第3.5.3节:

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


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

这基本上是我假设的,但找不到您链接的信息来为我自己确认。谢谢你!如果在事务期间刷新上下文,是否会导致@Transactional出现任何问题?我正试图发送数据以进行一些额外的验证,因此目标是使该验证成为事务的一部分。事务期间的刷新不应干扰
@Transactional