Hibernate-reactive: Mejora: integración con la anotación Spring @Transactional

Creado en 20 may. 2021  ·  16Comentarios  ·  Fuente: hibernate/hibernate-reactive

Hola,

estamos en la evaluación continua de hibernate reactivo para reemplazar nuestro software actual compuesto por postgres-db+spring boot+spring data+r2dbc. Enfrentamos muchas limitaciones al usar r2dbc y queríamos reutilizar el gran conocimiento que ya tenemos sobre Hibernate.
Casi refactorizamos un microservicio completo, reescribimos nuestros propios datos de primavera (repositorio genérico) y se ve muy bien.

Uno de los principales problemas que plantean los desarrolladores es la opción de utilizar la gestión de transacciones declarativas (mediante anotaciones) en lugar de la programática.

Sabemos que el propósito de Hibernate reactivo no es implementar dicho mecanismo, sino que los frameworks (Spring, Quarkus...) se integren con Hibernate, como se hizo con Hibernate estándar. Incluso si queremos hacerlo nosotros mismos, la API de transacción en Hibernate reactivo no es la misma que la API estándar de Hibernate y no hay una API para interactuar con el administrador de transacciones.

Estaré feliz si podemos recibir sus comentarios sobre esto (y aún más si puede :smiley:), y si aún cree que podemos hacerlo para proponer las pautas generales porque actualmente no tenemos idea de cómo hacerlo.
Gracias

problem

Todos 16 comentarios

Bueno, supongo que Spring tiene algún tipo de concepto de interceptor en el que podría usar anotaciones para vincular un interceptor a una llamada de método de bean. Si llama a withTransaction() desde dentro de un interceptor como ese, y luego delega al método bean, eso es todo lo que es la administración de transacciones declarativas. Realmente debería ser solo unas pocas líneas de código. (Al menos sería en CDI, estoy menos seguro sobre la primavera).

La única sutileza es que necesita una forma de detectar si ya hay una transacción vinculada a la corriente reactiva actual. En nuestra pila, eso se haría usando MP Contexts. No tengo idea de cómo se hace eso en Spring Land.

(OTOH, si está preguntando cómo integrarse con un administrador de transacciones XA, bueno, eso es una lata de gusanos completamente diferente, y no es realmente práctico con el controlador reactivo en este momento. Todavía no tenemos ninguna transacción verdaderamente reactiva gerentes.)

En este momento, no tenemos necesidad de transacciones distribuidas

Entonces, un interceptor que llame a SessionFactory.withTransaction() debería funcionar bien.

Intentaré de esta manera y actualizaré. Gracias

@gavinking parece que Spring implementa @Transactional usando Aspect. No es realmente tan importante, pero también puede ser más simple para nosotros de implementar.
Pero creo que no podemos hacerlo solo si expone una API para openTransaction() commitTransaction() y rollbackTransaction() en la clase Stage, ya que tenemos una API openSession() y closeSession(). Creo que se necesita el objeto de transacción y withTransaction no es suficiente.
Tiene sentido ?

Debería haber algún tipo de noción de un interceptor "alrededor" que le permita envolver y reenviar al método.

(Es cierto que no puede hacerlo con los interceptores antes/después).

@gavinking , ¿puede dar más detalles sobre lo que escribió antes "En nuestra pila, eso se haría usando MP Contexts". para verificar si una transacción ya está vinculada en el flujo actual? ¿Puede consultar el código o las pruebas que se escribieron? Lo mismo para la sesión, ¿cómo puedo entender que una sesión ya está abierta en la secuencia actual?
Gracias.

Mira, no tengo ni idea de cómo haces eso en primavera. Necesita algún tipo de construcción que sea como un subproceso local, pero un enlace local al flujo reactivo actual en lugar del subproceso. Estoy seguro de que deben tener algo.

Actualmente no voy a usar spring @Transactional pero implementaré nuestra propia anotación transaccional para evitar profundizar demasiado en Spring. Entonces, mi pregunta anterior estaba relacionada con su oración "En nuestra pila, eso se haría usando contextos MP".

"nuestra pila" == Quarkus.

Estoy diciendo que tienes que encontrar algo similar en el entorno de Spring.

Porque si no puede vincular un valor al flujo reactivo actual, entonces no puede tener transacciones declarativas, así de simple, y solo tendrá que administrar las transacciones "manualmente". (Lo que en realidad es súper simple simplemente llamando a withTransaction() . Realmente no entiendo por qué la gente piensa que necesita una anotación para eso).

Pero estoy seguro de que debe haber alguna manera de hacerlo. Simplemente le estás preguntando a la persona equivocada.

Cierre: reemplazado por #782.

@yaakov-berkovitch con las cosas que estoy implementando con el n.° 779, debería ser aún más fácil para usted implementar esto.

@gavinking Gracias!!

¿Fue útil esta página
0 / 5 - 0 calificaciones