使用休眠 4.0 和 spring 3.1.0.release 的活动列表?

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

在 spring 3.1.0 之前,它持有一个保留 eventlistener 的属性。但是在3.1.0.release中,没有事件列表映射。现在,我无法在保存更新,后加载等上保持模式对象的跟踪,因为它们不是由Spring配置的。你有解决这个问题的想法吗?LocalSessionFactroyBean


答案 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


答案 2

新方法是使用集成器注册事件侦听器。Hibernate现在将使用服务发现来注册事件侦听器,以下是我如何使用maven原型web应用程序使其工作。

在 META-INF/services(应位于您的资源目录下)下创建一个名为 org.hibernate.integrator.spi.Integrator 的文件,其中包含实现休眠 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(此处未显示)


推荐