Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-跳过特定操作或事务的环境历史记录_Java_Hibernate_Transactions_History_Hibernate Envers - Fatal编程技术网

Java Hibernate-跳过特定操作或事务的环境历史记录

Java Hibernate-跳过特定操作或事务的环境历史记录,java,hibernate,transactions,history,hibernate-envers,Java,Hibernate,Transactions,History,Hibernate Envers,我们目前正在使用Envers进行历史记录。有时,我们必须创建某些数据的临时副本,或者只是不希望某些事情最终成为历史。目前,我们有一个非常丑陋的解决方案。该解决方案是一个全局布尔值,它不能保证线程安全,并且可能会导致某些本应被历史化的数据不被历史化,或者反过来 我想知道是否有什么好的解决办法。我假设一种方法可能是使用EnversPost*EventListeners并标记每个应该忽略一次的bean。然而,虽然这听起来不那么可怕,但我担心它可能仍然不会很好地结束,因为我不太确定Hibernate中的

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

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


无论如何,在我看来,应该有更好的内置解决方案来解决这个问题,但我什么也找不到。

听起来你所描述的是所谓的条件审计

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

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

扩展必要的侦听器后,需要通过设置
hibernate.Envers.autoRegisterListeners=false
,将Envers配置为不注册自己的侦听器


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

听起来像您描述的是所谓的条件审核

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

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

扩展必要的侦听器后,需要通过设置
hibernate.Envers.autoRegisterListeners=false
,将Envers配置为不注册自己的侦听器


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

我明白了,这是我试图避免的,因为它已经是我们的解决方案。我只需要改进我们现有的解决方案。我明白了,这正是我试图避免的,因为这已经是我们得到的解决方案。那么我只需要改进我们现有的解决方案。