Hibernate Envers:获取新创建的实体项的修订版

时间:2017-11-03 13:50:40

标签: spring hibernate hibernate-envers

我有一个经过审核的实体:

@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交易有关。

1 个答案:

答案 0 :(得分:0)

您遇到的问题与Envers在事务的完成前回调中刷新其审计操作队列这一事实有关,该事件恰好在提交发生之前发生。

您有几个选择。

  • 重构代码,以便在事务提交后构造DTO,从而允许您在Envers审计历史记录表中查询所需的修订号。
  • 使用Spring TransactionSynchronizationManagerafterCommit注册同步回调,执行Envers审核历史表查询并在部分构建的DTO中注入修订号。
  • 使用Spring较新的@TransactionEventListener方法,您可以基本上执行相同的afterCommit逻辑,但方式更清晰,解耦