Listener de eventos de Hibernate con servicios de Spring

Publicado por pico.dev el .
blog-stack java planeta-codigo programacion
Comentarios

Java

En el anterior artículo explicaba como crear un listener que reciba eventos de Hibernate pero quizá necesitemos en el listener hacer uso de un servicio de Spring si el proceso de la acción necesita aprovecharse de la funcionalidad proporcionada en los servicios. En este artículo mostraré como crear un listener de Hibernate que use un servicio de Spring, es decir, un listener de Hibernate con la posibilidad de inyectar servicios de Spring.

Para hacer la integración de los listeners con Spring debemos sustituir el Interceptor por un servicio que haga lo mismo pero al inicio del contenedor de Spring con la anotación @PostConstruct. Para ello creamos una clase con el siguiente contenido:

Configurando Spring con anotaciones y código Java, como es recomendable en vez de xml, la configuración del ejemplo es la siguiente y un archivo xml casi testimonial de Spring. En esta configuraicón vemos el servicio ProductoEventAdapter que usaremos para recibir los eventos y el servicio DummyService que se inyectará en el anterior:

En el listener haremos uso de un servicio de Spring que podemos inyectar usando la anotación @Autorwire tal y como hacemos normalmente usando el contenedor de depednecias de Spring. La implementación con respecto a usar un listener con solo Hibernate varía ligeramente para adaptarse a los cambios de usar un servicio.

En este ejemplo el resultado que veríamos en la consola sería el siguiente con las trazas Action: preInsert, Id: null y Action: postInsert, Id: 1 antes y después de ejecutarse la sentencia SQL:

Usando los listeners de Hibernate con Spring no necesitamos el archivo que creábamos antes en /META-INF/services/org.hibernate.integrator.spi.Integrator. Esto es un ejemplo de prueba de concepto pero perfectamente podría ser aplicado a una necesidad real. En el ejemplo PlugIn Tapestry que hice para un libro sobre el framework de desarrollo web Apache Tapestry puede verse el código completo y funcional de esta implementación.