Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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 以异步方式实现Envers审核的可能性_Java_Hibernate_Hibernate Envers - Fatal编程技术网

Java 以异步方式实现Envers审核的可能性

Java 以异步方式实现Envers审核的可能性,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,我在我的项目中添加了enver,审计表正在更新实体创建/更新事务。太好了 现在,我希望以异步方式执行审计表更新事务。我试图实现的是——即使审核事务失败,主事务也不应该回滚 如果以前有人尝试过,请给出一些提示。开箱即用,这根本不可能。Envers钩住默认的Hibernate事件系统,该系统以同步方式触发所有侦听器 从逻辑上讲,标记待审计实体并将其状态作为变更的历史记录进行维护,而允许该实体进行变更,无论其变更的历史记录是否有效,这是没有意义的。这比其他任何东西更能说明总体设计或部署问题 我想说的是

我在我的项目中添加了enver,审计表正在更新实体创建/更新事务。太好了

现在,我希望以异步方式执行审计表更新事务。我试图实现的是——即使审核事务失败,主事务也不应该回滚


如果以前有人尝试过,请给出一些提示。

开箱即用,这根本不可能。Envers钩住默认的Hibernate事件系统,该系统以同步方式触发所有侦听器

从逻辑上讲,标记待审计实体并将其状态作为变更的历史记录进行维护,而允许该实体进行变更,无论其变更的历史记录是否有效,这是没有意义的。这比其他任何东西更能说明总体设计或部署问题


我想说的是如何集成Envers和Hibernate,如果您需要异步的、不可靠的审核,那么您可能需要编写自己的解决方案。

您可以为版本3提供AuditEventListener。在v4之后,每个事件类型都有不同的类,因此您必须为每个事件类型都有一个类(org.hibernate.envers.event.EnversPostInsertEventListenerImpl等),但除此之外,没有什么不同

下面是版本3的代码的外观:

public class MyEventListener extends org.hibernate.envers.event.AuditEventListener {
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    @Override
    public void onPostInsert(PostInsertEvent event) {
        super.onPostInsert(event);
    }

    @Override
    public void onPostUpdate(final PostUpdateEvent event) {
        Runnable runIt = new Runnable() {
            public void run() {
                System.out.println("Running in a thread now");
                MyEventListener.super.onPostUpdate(event);
                System.out.println("Finished OnPostUpdate THREAD!!!!");
            }
        };
        executorService.submit(runIt);
        System.out.println("Finished OnPostUpdate call");
    }

    @Override
    public void onPostDelete(PostDeleteEvent event) {
        super.onPostDelete(event);
    }

    @Override
    public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
        super.onPreUpdateCollection(event);
    }

    @Override
    public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
        super.onPreRemoveCollection(event);
    }

    @Override
    public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
        super.onPostRecreateCollection(event);
    }
}

请提供一些导致任何问题的代码。所以这不是一个“编写我的代码”的平台。我没有遇到任何代码错误,如果有人曾经尝试过,我会寻求一些提示。我搜索了enverswiki,他们说它是同步的,审计发生在事务结束时。有了这段代码,你可以使它异步。在一个事务中,它只会保存在审计表中