eventlisteners使用hibernate 4.0与spring 3.1.0.release?

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

在3.1.0之前, LocalSessionFactroyBean持有一个保存eventlistener的属性。 但是3.1.0.release没有eventlisteners映射。 现在,我保留了saveorupdate,postload等模式对象的轨迹,因为它们没有被Springconfiguration。 你有解决这个问题的想法吗?

我有同样令人沮丧的问题。 Hibernate 4似乎已经从根本上改变了你注册事件的方式,Spring组织还没有赶上。 这是我使用init方法注册侦听器的基于注解的解决scheme:

 @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

新的方法是使用一个Integrator来注册事件监听器。 Hibernate现在将使用服务发现来注册事件监听器,下面是我如何使用maven原型-webapp

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

META-INF /服务/ 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(此处未显示)

你可能想检查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

希望这可以帮助有人find这个问题的答案。