Spring sincroniza transacciones Hibernate y JMS

Estoy trabajando en una aplicación independiente que utiliza tanto JMS como Hibernate.

La documentación sugiere que se debe usar JTA si quiero tener transacciones entre ambos recursos.

Sin embargo, ahora mismo con un método DAO anotado en @Transaction (y HibernateTransactionManager), esto ya parece funcionar. Cuando llamo a send () en JmsTemplate, el mensaje no se envía inmediatamente, sino que la sesión JMS se confirma con la sesión de Hibernate a medida que el método regresa.

No sabía cómo es posible sin el JtaTransactionManager, así que verifiqué el código fuente. Resulta que tanto el contenedor para Hibernate como JmsTemplate registran las sesiones con TransactionSynchronizationManager y la sesión JMS se confirmará cuando se confirme la sesión de Hibernate.

¿Cuál es la diferencia entre esto y una transacción JTA. ¿Puedo usar esto para reemplazar este último?

Respuestas a la pregunta(2)

Su respuesta a la pregunta