我有一个经过审核的实体:
@Entity
@Audited
public class MyEntity {
...
}
以及服务层中的创建方法:
@Transactional
public MyDto createMyEntity() {
MyEntity newEntity = new MyEntity();
newEntity = repository.save(newEntity);
// {1}
return toDto(newEntity); // {2}
}
{2}将现有MyEntity
字段映射到相应的MyDto
字段。
MyDto
由与MyEntity
相同的字段组成,此外,revisionNumber
:
public class MyDto {
...
private int revisionNumber;
// getters and setters
...
}
我的目标是从createMyEntity()
返回具有有效revisionNumber
的MyDto
,但我无法在步骤{1}检索此信息,因为新MyEntity
实际上并未在数据库中创建。
这个问题甚至可能与Envers无关,而是与一般的Hibernate事务有关。
您面临的问题与 Envers 在事务的完成前回调中刷新其审核操作队列这一事实有关,该回调发生在提交发生之前。
您有几个选择。
- 重构代码,以便在事务提交后构造 DTO,从而允许您在 Envers 审核历史记录表中查询所需的修订号。
- 使用 Spring 的
TransactionSynchronizationManager
为执行 Envers 审计历史记录表查询并在部分构造的 DTO 中注入修订号的afterCommit
注册同步回调。 - 使用Spring较新的
@TransactionEventListener
方法,您基本上可以执行相同的afterCommit
逻辑,但以更简洁的方式被认为是解耦的。