Solución:
Bueno, para empezar, ambos son Transacciones, pero abarcan diferentes conceptos y componentes.
TL; DR
Hibernate se ocupa de transacciones específicas de bases de datos, mientras que Spring proporciona un servicio general de gestión de transacciones. @Transactional
es una buena forma de configurar el comportamiento de la gestión de transacciones.
La larga historia:
Actas
Las transacciones son básicamente unidades de trabajo (es decir, cambios en algo) que se gestionan como una única operación que puede confirmarse o revertirse. Hay muchos tipos diferentes de transacciones en el mundo de Java: bases de datos, sistemas de mensajería como JMS, transacciones entre aplicaciones (para aquellos que no son débiles de corazón) o cualquier otra cosa que deba incluirse en una transacción. En el estándar de Java, las transacciones se gestionan mediante la API de transacciones de Java, que establece las reglas sobre cómo participar en una transacción.
Hibernar
Hibernate es un ORM para abstraer componentes de bases de datos a objetos Java, por lo que sus transacciones están específicamente relacionadas con los cambios realizados dentro de una base de datos. Una transacción puede estar formada por una o varias escrituras en varias tablas de la base de datos que se confirman una vez que se completa la operación. Revertir la transacción, por ejemplo, si hay algún error durante la operación, permite deshacer todos los cambios.
Primavera
En su nivel más bajo, Spring es un marco de aplicación para administrar la configuración y las dependencias entre objetos. Además, también proporciona una interfaz para administrar servicios de nivel superior que se utilizan en aplicaciones modernas como bases de datos, servicios de mensajería, marcos MVC y transacciones.
Spring está diseñado para ser utilizado como un maestro integral de objetos y servicios dentro de su aplicación, por lo que su concepto de transacción está en un nivel más alto que las transacciones específicas de la base de datos de las que se ocupa hibernación. Las transacciones de Spring están diseñadas para brindarle un control detallado de todos sus recursos transaccionales mientras se abstrae la codificación, a menudo desordenada, requerida para coordinar las transacciones.
@Transactional
Spring proporciona algunos métodos diferentes para usar transacciones, entre otros, aspectos basados en xml, codificación para la API y transacciones declarativas basadas en anotaciones. Las transacciones basadas en anotaciones son útiles porque no necesita agregar el código repetitivo de administración de transacciones a su aplicación (incluso el uso de PlatformTransactionManager a través de la API tiene bastante sobrecarga de codificación).
Entonces, básicamente, ¿qué pasa con @Transactional
es que, en tiempo de ejecución, Spring escanea su base de código en busca de clases y métodos @Transactional y los envuelve en el código de administración específico de la transacción, según lo que haya configurado a través de la anotación. Entonces, un método como este:
@Transactional(propagation = REQUIRES_NEW, rollbackFor = {Exception.class})
public void saveAndSendMessage(Foo foo) throws Exception {
dbManager.save(foo);
Bar bar = transform(foo);
jmsSystem.send(bar);
}
Spring puede configurar una nueva transacción para la base de datos y el sistema jms, y coordinarlos sin necesidad de agregar automáticamente todo el código de administración de tx específico.