【问题标题】:Hibernate - Skip Envers historisation for specific action or a transactionHibernate - 跳过特定操作或事务的 Envers 历史记录
【发布时间】:2020-03-14 16:54:28
【问题描述】:

我们目前正在使用 Envers 进行历史化。有时我们必须创建某些数据的临时副本,或者只是不希望某些事情最终成为历史。目前,我们有一个非常丑陋的解决方案。该解决方案是一个全局布尔值,它不能保证线程安全,并且可能会导致某些本应被历史记录的数据不被历史记录或相反。

我想知道是否有任何好的解决方案。我假设一种方法可能是使用EnversPost*EventListeners 并标记每个应该被忽略一次的bean。然而,虽然这听起来不那么可怕,但我担心它最终可能不会很好,因为我不太确定 Hibernate 中的对象生命周期是什么样的以及这是否会导致误报。

无论如何,在我看来应该有一些更好的内置解决方案来解决这个问题,但我找不到任何东西。

【问题讨论】:

    标签: java hibernate transactions history hibernate-envers


    【解决方案1】:

    听起来您所描述的称为条件审计。

    目前唯一的方法是扩展现有的 Hibernate Envers 侦听器并添加任何您需要跳过基于实体的当前状态创建审计实体行的逻辑。您会在 org.hibernate.envers.event.spi 中找到相当多的侦听器,涵盖所有必要的生命周期回调,不仅适用于实体,还适用于与实体关联的集合。

    一般来说,post 事件在这里很重要。有一些 pre-collectionpre-update 事件侦听器,但唯一可能需要扩展的可能是与集合相关的那些,具体取决于您使用的实体映射。

    在扩展必要的侦听器后,您需要通过设置 hibernate.envers.autoRegisterListeners=false 来配置 Envers 不注册自己的侦听器。

    您还需要引入一个自定义的Integrator 实现来执行扩展侦听器的注册。您可以查看org.hibernate.envers.EnversIntegrator 中的代码,了解如何执行此操作的所有相关细节。这些集成器是使用 Java 服务 API 检测的,因此您还需要将 META-INF/services/org.hibernate.integrator.spi.Integrator 文件添加到列出您的自定义集成器的类路径中,以便可以找到它。

    【讨论】:

    • 我明白了,这是我试图避免的,因为它已经是我们得到的解决方案。那我只需要改进我们现有的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多