休眠版本:获取新创建的实体项的修订版



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

@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()返回具有有效revisionNumberMyDto,但我无法在步骤{1}检索此信息,因为新MyEntity实际上并未在数据库中创建。

这个问题甚至可能与Envers无关,而是与一般的Hibernate事务有关。

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

您有几个选择。

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

最新更新