【问题标题】:hibernate envers 4: enable delete listenerthibernate envers 4:启用删除侦听器
【发布时间】:2014-07-02 16:58:25
【问题描述】:

我需要您的帮助:我正在使用 hibernate envers 4.1.12,我只想启用删除侦听器,但我无法做到。 我知道从 hibernate 4 开始不再需要在配置文件中声明监听器,但默认情况下所有操作都在审计表中触发,我只需要监控删除的操作。

你能帮帮我吗?

提前致谢。

【问题讨论】:

    标签: java spring hibernate hibernate-envers


    【解决方案1】:

    查看手册中的Conditional audition 部分。

    你基本上需要做的是:

    • 关闭自动监听器注册
    • 编写一个自定义的Integrator,它只使用delete 监听器(基于EnversIntegrator
    • 设置积分器

    【讨论】:

    • 是的,我就是这样解决的。我真的不得不说,从我的角度来看,这种方法真的很糟糕。旧的方式要好得多。无论如何,感谢您的帮助。
    【解决方案2】:

    我告诉你我做了什么:因为我使用的是 maven,所以项目结构是众所周知的 [link] (http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html)。因此,在 src/main/resources 我创建了一个文件夹 META-INF/services/ 并添加了一个标记为 org.hibernate.integrator.spi.Integrator 的文件。该文件包含实现 EnversIntegrator 接口的类的名称(在我的例子中:eu.dada.prov.sitelock.common.listener.CustomHibernateListenerIntegrator)就是这样。

    班级是:

    @Component
    public class CustomHibernateListenerIntegrator extends EnversIntegrator {
    @Override
    public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
    
        EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
        listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE);
    
        final AuditConfiguration enversConfiguration = AuditConfiguration.getFor(configuration);
    
        if (enversConfiguration.getEntCfg().hasAuditedEntities()) {
            listenerRegistry.appendListeners(EventType.POST_DELETE, new DeleteEnversListener(enversConfiguration));
            listenerRegistry.appendListeners(EventType.PRE_UPDATE, new UpdateEnversListener(enversConfiguration));
            listenerRegistry.appendListeners(EventType.LOAD, new ProductLoadEventListener());
        }
    }
    }
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      Spring Boot 1.5.6

      我在使用带有on cascade delete 的更新版 Hibernate 时遇到了同样的问题:envers 想要插入一条引用已删除 ID 的记录,从而引发了约束冲突。

      只需添加此答案,以防有人发现它有用。

      关闭 application.properties 中的所有 envers 侦听器(以及等效的测试配置,如果有的话)。

      spring.jpa.properties.hibernate.envers.autoRegisterListeners=false
      

      添加你想要的(这里我只想插入和更新)。

       @Component
       public class HibernateListenerConfigurer
       {
         @PersistenceUnit
         private EntityManagerFactory entityManagerFactory;
      
         @PostConstruct
         protected void init()
         {
            SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class);
            EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
            EnversService enversService = sessionFactory.getServiceRegistry().getService(EnversService.class);
      
            registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(new EnversPostInsertEventListenerImpl(enversService));
            registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(new EnversPostUpdateEventListenerImpl(enversService));
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        相关资源
        最近更新 更多