【问题标题】:Hibernate Envers: get revision for the newly created entity itemHibernate Envers:获取新创建的实体项的修订版
【发布时间】:2018-04-16 06:45:22
【问题描述】:

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

@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 事务有关..

【问题讨论】:

    标签: spring hibernate hibernate-envers


    【解决方案1】:

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

    你有几个选择。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2017-11-28
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2021-04-06
      • 2010-10-22
      相关资源
      最近更新 更多