spring-3 event-listener hibernate-4.x

eventlisteners utilizando hibernate 4.0 con spring 3.1.0.release?



spring-3 event-listener (4)

Cuando agregue escuchas de eventos personalizados a través de la clase EventListenerRegistry como se menciona en las respuestas anteriores, debe asegurarse de que se eliminen las escuchas de eventos predeterminadas. De lo contrario, si en su aplicación hay un mapeo de una sola persona, se lanzará la excepción "Excepción de hibernación: referencias compartidas a la colección: xyz"

Estos frascos son nuevos lanzados y tienen las últimas soluciones para aplicaciones Java EE. Pero tengo un problema en la especificación de oyentes de hibernación en hibernate.cfg.xml.

Antes de la primavera 3.1.0, LocalSessionFactroyBean tenía un atributo que mantiene a los eventlisteners. Pero con 3.1.0. Por favor, no hay ningún mapa de listadores de eventos. Ahora no consigo mantener el seguimiento de los objetos modales en saveorupdate, postload, etc. porque Spring no los ha configurado. ¿Tienes una idea para resolver este problema?


El nuevo enfoque es utilizar un Integrador para registrar a los oyentes de eventos. Hibernate ahora usará el descubrimiento de servicios para registrar a los oyentes de eventos y aquí es cómo funcionó usando una aplicación web de arquetipo de Maven.

cree un archivo bajo META-INF / services (que debe residir en su directorio de recursos) llamado org.hibernate.integrator.spi.Integrator con todas las clases que implementan la interfaz spi de hibernate, una línea cada una. Breve ejemplo a continuación:

...

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

Cualquier entidad que necesite tener este evento registrado debe implementar MyPersistableEntity (no se muestra aquí)


Es posible que desee consultar el ticket de hibernación [1]: https://hibernate.onjira.com/browse/HHH-6945

La guía de migración dice:

hibernate.cfg.xml ya no se admite como medio para especificar escuchas. El nuevo enfoque se basa en un org.hibernate.integrator.spi.Integrator que funciona según el "descubrimiento del servicio".

Y puede obtener las instrucciones completas en http://in.relation.to/Bloggers/EventListenerRegistration

Los enlaces en el ticket tienen algún problema, usa lo siguiente:

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

Espero que esto ayude a alguien que busca respuestas para este problema.


Tuve el mismo problema frustrante. Hibernate 4 parece haber cambiado fundamentalmente la forma en que te registras para los eventos y el grupo Spring aún no se ha puesto al día. Aquí está mi solución basada en anotaciones usando un método init para registrar un oyente:

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

Un interceptor sería otro buen enfoque, pero el soporte para interceptores se eliminó por error: https://jira.springsource.org/browse/SPR-8940