transaction transaccional example driven annotation java spring hibernate transactions jta

transaccional - javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional



transaccional spring boot (3)

Otra diferencia es cómo Spring maneja las anotaciones @Transactional

  • org.springframework.transaction.annotation.Transactional siempre se tiene en cuenta
  • javax.transaction.Transactional solo se tiene en cuenta cuando hay transacciones EJB3. La presencia de transacciones EJB3 se realiza comprobando si la clase javax.ejb.TransactionAttribute está disponible en classpath (de la versión 2.5.3 a la 3.2.5). Por lo tanto, puede terminar con sus anotaciones que no se tienen en cuenta si solo javax.transaction.Transactional está en su classpath y no javax.ejb.TransactionAttribute . Este puede ser el caso si está trabajando con Hibernate: hibernate-core (4.3.7.Final) depende de jboss-transaction-api_1.2_spec (1.0.0.Final), que no proporciona javax.ejb.TransactionAttribute .

No entiendo cuál es la diferencia real entre las anotaciones javax.transaction.Transactional y org.springframework.transaction.annotation.Transactional ?

¿ org.springframework.transaction.annotation.Transactional es una extensión de javax.transaction.Transactional o tienen un significado totalmente diferente? ¿Cuándo debería usarse cada uno de ellos? Spring @Transactinal en la capa de servicio y javax en DAO?

Gracias por responder.


Spring ha definido su propia anotación transaccional para hacer que los métodos Spring Bean sean transaccionales, hace años.

Java EE 7 finalmente ha hecho lo mismo y ahora permite que los métodos de beans CDI sean transaccionales, además de los métodos EJB. Entonces, desde Java EE 7, también define su propia anotación transaccional (obviamente no puede reutilizar la de Spring).

En una aplicación Java EE 7, usarás la anotación Java EE.

En una aplicación de Spring, usará la anotación Spring.

Su uso es el mismo: informar al contenedor (Java EE o Spring) que un método es transaccional.


Tenga cuidado, (este problema sucedió en tomcat),

Si su aplicación es SPRING y está utilizando el mecanismo de manejo de transacciones de Spring que es @org.springframework.transaction.annotation.Transactional , entonces no lo mezcle con javax.transaction.Transactional.

Ese es siempre el uso, @org.springframework.transaction.annotation.Transactional en una aplicación de primavera consistentemente.

De lo contrario, podemos terminar con este error,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed ........ Caused by: java.sql.SQLException: Protocol violation: [0]