使用带有spring 3.1.0.release的hibernate 4.0的eventlisteners?

asy*_*ard 19 java event-listener spring-3 hibernate-4.x

这些罐子都是新发布的,并且拥有最新的Java EE应用程序解决方案.但是我在hibernate.cfg.xml中指定hibernate监听器时遇到了问题.

在春季3.1.0之前,LocalSessionFactroyBean持有一个保存eventlisteners的属性.但是使用3.1.0.release没有eventlisteners地图.现在我无法在saveorupdate,postload等上保持模态对象的跟踪,因为它们不是由Spring配置的.你有想法解决这个问题吗?

小智 34

我遇到了同样令人沮丧的问题.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

拦截器将是另一种很好的方法,但是对拦截器的支持被错误地删除了:https://jira.springsource.org/browse/SPR-8940


Dav*_*ago 13

新方法是使用Integrator注册事件侦听器.Hibernate现在将使用服务发现来注册事件监听器,这是我如何使用maven archetype-webapp工作

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

...

META-INF /服务/ org.hibernate.integrator.spi.Integrator

com.example.CustomIntegrator
Run Code Online (Sandbox Code Playgroud)

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);
        ...
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

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
            ...
        }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

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