gpt4 book ai didi

hibernate - 如何强制 Hibernate Envers 在 Spring @Transactional 方法中提交修订

转载 作者:行者123 更新时间:2023-12-04 16:09:52 25 4
gpt4 key购买 nike

我正在使用 Hibernate Envers 来保存对象历史记录。在某些时候,我们想要捕获对象图状态的快照——我们可以通过知道相应的 Envers 修订来做到这一点,然后我们将其存储在审计记录中。

然而,我们有一个问题。父对象在我们创建和存储其子审计记录的同一事务中更新 - 完成 Envers 修订。我们可以得到最新版本:

Number revision = reader.getRevisionNumberForDate(new Date(Long.MAX_VALUE));

或创建一个新版本:
Number revision = reader.getCurrentRevision(DefaultRevisionEntity.class, true).getId();

并使用其中一个,但父级的提交总是在此之后发生。这就是 Envers 增加修订的时候。因此,我们在审计记录中实际需要引用的修订总是高于存储的值。在最简单的情况下,我们获取并存储修订版 N,但我们需要的父版本存储为 N + 1。

可以通过以下方式获得 AuditReader 阅读器引用:
JpaTransactionManager transactionManager;  // injected
EntityManagerFactory emf = transactionManager.getEntityManagerFactory();
EntityManager entityManager = emf.createEntityManager();
AuditReader reader = AuditReaderFactory.get(entityManager);

我们正在使用 Spring 3 @Transactional 注释和 Hibernate 4.2。

最小类图:
Parent.class
int version // for hibernate optimistic locking
String revisionName
List<AuditChild> audits

AuditChild.class
int enversRevision // use to retrieve previous graphs of parent

我尝试了多种方法来强制首先发生 parent 的提交,其中包括:
  • 使用@Transactional(propagation = Propagation.REQUIRES_NEW)
  • 在多个方法之间拆分代码
  • 显式调用 entityManager.flush();

  • 我尝试过的所有方法要么没有效果,要么引起了其他问题。我很高兴听到对其他人有效的解决方案。谢谢。

    最佳答案

    一个更简单的选择是使用 @Version .

    首先,Envers 需要配置为实际审计乐观锁定字段的值,默认情况下它不会这样做。您可以通过设置以下配置来做到这一点:

    org.hibernate.envers.do_not_audit_optimistic_locking_field=false

    此时,Envers 将在审计历史表中包含该字段,并将分配的 ORM 版本值复制到审计历史表中。此时,我们有一种独特的方式使用 @Formula 将 ORM 实体行与审计历史行连接起来。 .公式 SQL 将是:
    SELECT e.REV
    FROM YourEntity_AUD e
    WHERE e.originalId.id = id
    AND e.version = version

    现在就像向实体添加字段一样简单:
    @Formula( /* the SQL from above */)
    @NotAudited
    private Integer revisionNumber;

    哈。

    关于hibernate - 如何强制 Hibernate Envers 在 Spring @Transactional 方法中提交修订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22869284/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com