我有一个经过审核的实体:
@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()
MyDto
返回有效revisionNumber
,但我无法在步骤{1}检索此信息,因为新的MyEntity
是实际上并没有在数据库中创建。
这个问题甚至可能与Envers无关,而与Hibernate交易有关。
答案 0 :(得分:0)
您遇到的问题与Envers在事务的完成前回调中刷新其审计操作队列这一事实有关,该事件恰好在提交发生之前发生。
您有几个选择。
TransactionSynchronizationManager
为afterCommit
注册同步回调,执行Envers审核历史表查询并在部分构建的DTO中注入修订号。@TransactionEventListener
方法,您可以基本上执行相同的afterCommit
逻辑,但方式更清晰,解耦。