eventlisteners que usan hibernate 4.0 con la spring 3.1.0.release?

Estos flasks son nuevos lanzados y tienen las últimas soluciones para aplicaciones Java EE. Pero tengo un problema para especificar detectores de hibernación en hibernate.cfg.xml.

Antes de la spring 3.1.0, LocalSessionFactroyBean tenía un atributo que mantiene eventlisteners. Pero con 3.1.0.release no hay ningún mapa de eventlisteners. Ahora no puedo seguir la pista de los objetos modales en saveorupdate, postload, etc. porque Spring no los configuró. ¿Tienes una idea para resolver 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 apoyo a los interceptores se eliminó por error: https://jira.springsource.org/browse/SPR-8940

El nuevo enfoque es usar un integrador para registrar los oyentes del evento. Hibernate ahora usará el descubrimiento de servicios para registrar oyentes de eventos y aquí es cómo lo hice funcionar usando un maven archetype-webapp

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 hibernate spi, una línea cada una. Ejemplo corto 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 registrar este evento debe implementar MyPersistableEntity (no se muestra aquí)

Puede consultar el ticket de Hibernate [1]: https://hibernate.onjira.com/browse/HHH-6945

La guía de migración dice:

hibernate.cfg.xml ya no es compatible como medio de especificar oyentes. El nuevo enfoque involuciona el uso de un org.hibernate.integrator.spi.Integrator que funciona en base al “descubrimiento de servicios”.

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

Los enlaces en el ticket tienen algún problema, use 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 buscando respuestas para este problema.

Al agregar escuchas de eventos personalizadas a través de la clase EventListenerRegistry como se menciona en las respuestas anteriores, es necesario asegurarse de que se eliminen los detectores de eventos predeterminados. De lo contrario, si en su aplicación hay un mapeo onetomany, se lanzará la excepción “Excepción de Hibernación: referencias compartidas a la colección: xyz”

    Intereting Posts