【问题标题】:Alternative to deprecated AuditReader#getCurrentRevision method替代已弃用的 AuditReader#getCurrentRevision 方法
【发布时间】:2020-05-06 18:14:20
【问题描述】:

我正在将一个 java 应用程序从 Spring Boot 1.5 迁移到 Spring Boot 2.2.3,这涉及将 Hibernate/Envers 升级到 5.4.10.Final。

现有代码调用 AuditReader#getCurrentRevision(Class revisionEntityClass, boolean persist) 已弃用,JavaDocs 状态使用 RevisionListener 但这与我们需要获取 将要进行的修订不同 strong> 在现有事务提交时创建。 getCurrentRevision 方法为我们提供了该功能,但直到我们的代码需要修订号并且传递给 RevisionListener#newRevision 方法的 revisionEntity 尚未设置其 id 之后才会调用 RevisionListener。 RevisionListener 似乎更倾向于设置关于修订实体的附加信息,而不是从中获取信息。

如何获得将作为当前事务的一部分创建的修订?

谢谢

【问题讨论】:

  • 您能否详细说明为什么需要修订号?您是否使用实体映射上的字段来存储此值?如果确实如此,也许更好的解决方案可能是让 Envers 提供可用于生成值的注释,例如 @CreationTimestamp 在 ORM 中工作,它会提前自动分配修订号并保证它被存储在无需担心任何用户代码的实体。
  • 嗨@Naros ...我们将修订存储在作为日终处理的一部分处理的实体上。通过这样做,我们可以访问事件发生时的帐户状态。
  • @Naros 您的评论确实让我想知道是否合适的方法是使用 RevisionListener。 threadlocal 允许我们在修订实体上设置一个值,然后我们可以将其与 AuditReader 一起使用,而不是实际修订。有什么需要调查的,谢谢。
  • 那么听起来注释值生成器的想法可能适合您。无论如何,这也是用户经常要求的东西,将来自 Envers 的修订号存储在实体本身中,因此这两者都兼顾。我会看看这周涉及的内容,并希望将其纳入 5.4.11 进行测试。
  • 感谢纳罗斯。请注意下面我的“答案”,我们现在有一些相当干净的工作。但与此同时,我们仍在研究升级,所以如果您提出的替代方案是您希望提供的东西,那么看看它是否适合我们的用例会很有趣。我假设它需要对事件实体进行审计,在这种情况下,它非常接近我在下面发布的解决方法,但在处理事件时不需要通过 AuditReader 进行查找的开销。

标签: java hibernate hibernate-envers


【解决方案1】:

要添加一些上下文...我们需要将当前修订存储在表示事件的实体上,以便可以在一天结束时重播该事件并访问事件发生时的帐户状态.

在我们之前的 (Spring Boot 1.5) 应用程序版本中,我们没有审核事件实体,因为我们没有必要。

为了解决被弃用并因此标记为删除的功能,我们只是开始审核事件实体。通过这种方式,我们能够在处理事件时而不是在插入事件时访问事件实体插入的修订,这为我们提供了引发事件时帐户状态的修订。

不是我原来问题的答案,而是功能要求的干净解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多