【发布时间】: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