【问题标题】:eventlisteners using hibernate 4.0 with spring 3.1.0.release?使用休眠 4.0 和 spring 3.1.0.release 的事件监听器?
【发布时间】:2012-01-26 19:39:12
【问题描述】:

这些 jar 都是新发布的,并且具有适用于 Java EE 应用程序的最新解决方案。但是我在 hibernate.cfg.xml 中指定休眠侦听器时遇到问题。

在 spring 3.1.0 之前,LocalSessionFactroyBean 持有一个保持事件监听器的属性。但是在 3.1.0.release 中没有 eventlisteners 映射。现在我无法在 saveorupdate、postload 等上跟踪模态对象,因为它们不是由 Spring 配置的。你有解决这个问题的想法吗?

【问题讨论】:

标签: java event-listener spring-3 hibernate-4.x


【解决方案1】:

我遇到了同样令人沮丧的问题。 Hibernate 4 似乎从根本上改变了您注册事件的方式,而 Spring 组尚未赶上。这是我使用 init 方法注册监听器的基于注释的解决方案:

@Component
public class HibernateEventWiring {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private SomeHibernateListener listener;

    @PostConstruct
    public void registerListeners() {
        EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(
        EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(listener);
        registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE).appendListener(listener);
    }
}

拦截器是另一种不错的方法,但错误地放弃了对拦截器的支持:https://jira.springsource.org/browse/SPR-8940

【讨论】:

  • 嗨,是的,我想出了这个解决方案。暂时运作良好。我希望这不是 hibernate-spring 集成的最新解决方案。谢谢。
  • 你知道如何设置监听器到某个实体吗?我看到您的实现向所有实体添加了侦听器。
  • 在不使用spring的时候也很有用。令人难以置信的是注册一个预插入监听器(不使用 xml)是多么复杂。仍然无法相信自动设置“创建”字段所需的代码量(在具有特定接口的任何实体上)。这是JAVAAAA
  • 另请参阅 PreInsert 和 PreUpdate 日期:stackoverflow.com/questions/5257709/…
【解决方案2】:

您可能想查看 Hibernate Ticket [1]:https://hibernate.onjira.com/browse/HHH-6945

迁移指南说:

hibernate.cfg.xml 不再支持作为指定方式 听众。新方法涉及使用 org.hibernate.integrator.spi.Integrator 基于“服务”工作 发现”。

你可以得到完整的说明@http://in.relation.to/Bloggers/EventListenerRegistration

票证中的链接有问题,请使用以下链接:

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/src/main/java/org/hibernate/envers/event/EnversIntegrator.java

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator

希望这对寻找此问题的答案的人有所帮助。

【讨论】:

    【解决方案3】:

    新方法是使用集成器来注册事件侦听器。 Hibernate 现在将使用服务发现来注册事件侦听器,这是我使用 maven archetype-webapp 使其工作的方法

    在 META-INF/services(应该位于资源目​​录下)下创建一个名为 org.hibernate.integrator.spi.Integrator 的文件,其中包含实现 hibernate spi 接口的所有类,每行一行。下面的简短示例:

    ...

    META-INF/services/org.hibernate.integrator.spi.Integrator

    com.example.CustomIntegrator
    

    com.example.CustomIntegrator

    package com.example;
    
    import ...;
    
    public void CustomIntegrator implements Integrator {
    
        static final Logger logger = LoggerFactory.getLogger(CustomIntegrator.class);
    
        @Override
        public void integrate(Configuration configuration, SessionFactoryImplementor implementor, SessionFactoryServiceRegistry registry) {
            final EventListenerRegistry eventRegistry = registry.getService(EventListenerRegistry.class);
    
            logger.info("Registering event listeners");
            // you can add duplication strategory for duplicate registrations
            ...
    
            // prepend to register before or append to register after
            // this example will register a persist event listener
            eventRegistry.prependListeners(EventType.PERSIST, myListener);
            ...
        }
    
        ...
    
    }
    

    com.example.MyListener

    package com.example;
    
    import ...
    
    public class MyListener implements PersistEventListener {
    
        static final Logger logger = LoggerFactory.getLogger(MyListener.class);
    
        public void onPersist(PersistEvent event) throws HibernateException {
            logger.debug("Entering MyListener");
    
            if(event.getObject() instanceof MyPersistableEntity) {
                MyPersistableEntity entity = (MyPersistableEntity) event.getObject();
                // do something with entity
                ...
            }
        }
    
        ...
    }
    

    任何需要注册此事件的实体都必须实现 MyPersistableEntity(此处未显示)

    【讨论】:

    【解决方案4】:

    当通过上述响应中提到的 EventListenerRegistry 类附加自定义事件侦听器时,需要确保删除默认事件侦听器。否则,如果在您的应用程序中存在 onetomany 映射,则会抛出“休眠异常:对集合的共享引用:xyz”异常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2015-04-05
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多