javax.transaction.Transactionnel vs org.springframework.transaction.annotation.Transactionnel

Je ne comprends pas quelle est la différence réelle entre les annotations javax.transaction.Transactional et org.springframework.transaction.annotation.Transactional?

Est org.springframework.transaction.annotation.Transactional une extension de javax.transaction.Transactional ou ils ont une signification tout à fait différente? Quand chacun d'eux devrait-il être utilisé? Printemps @Transactinal dans la couche de service et javax dans DAO?

Merci d'avoir répondu.

75
demandé sur Jonik 2014-10-15 20:22:40

3 réponses

Spring a défini sa propre annotation transactionnelle pour rendre les méthodes Spring bean transactionnelles, il y a des années.

Java EE 7 a finalement fait la même chose et permet maintenant aux méthodes CDI Bean d'être transactionnelles, en plus des méthodes EJB. Donc, depuis Java EE 7, Il définit également sa propre annotation transactionnelle (il ne peut évidemment pas réutiliser celle du printemps).

Dans une application Java EE 7, vous utiliserez L'annotation Java EE.

Dans une application Spring, vous utiliserez le Spring annotation.

Leur utilisation est la même: informer le conteneur (Java EE ou Spring) qu'une méthode est transactionnelle.

66
répondu JB Nizet 2014-10-15 16:54:07

Une autre différence est la façon dont Spring gère les annotations @ Transactional

  • org.springframework.transaction.annotation.Transactionnelle est toujours pris en compte
  • javax.transaction.Transactional n'est pris en compte que lorsque les transactions EJB3 sont présentes. La présence des transactions EJB3 se fait en vérifiant si la classe javax.ejb.TransactionAttribute est disponible dans le classpath (de la version 2.5.3 à 3.2.5). Ainsi vous pouvez vous retrouver avec vos annotations qui ne sont pas prises en compte compte si seulement javax.transaction.Transactional est dans votre classpath et pas javax.ejb.TransactionAttribute. Cela peut être le cas si vous travaillez avec Hibernate: hibernate-core (4.3.7.Final) dépend de JBoss-transaction-api_1. 2_spec (1.0.0.Final), qui ne fournit pas javax.ejb.TransactionAttribute.
32
répondu Jidehem 2015-06-22 12:58:37

Soyez prudent, (ce problème s'est produit dans tomcat),

Si votre application est une application web SPRING et que vous utilisez le mécanisme de gestion des transactions de Spring qui est @org.springframework.transaction.annotation.Transactional, ne le mélangez pas avec javax.transaction.Transactionnel.

C'est toujours utiliser, @org.springframework.transaction.annotation.Transactional dans une application spring de manière cohérente.

Sinon, nous pouvons nous retrouver avec cette erreur,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed

........

Caused by: java.sql.SQLException: Protocol violation: [0]
18
répondu Lyju I Edwinson 2014-12-25 04:12:51