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
票证中的链接有一些问题,请使用以下内容:
希望这可以帮助有人find这个问题的答案。