javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional
Je ne comprends pas quelle est la différence 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 ont-ils une signification totalement différente? Quand faut-il utiliser chacun d'eux? Printemps @Transactinal
dans la couche de service et javax dans DAO?
Merci de répondre.
Spring a défini sa propre annotation transactionnelle pour rendre les méthodes de beans Spring transactionnelles, il y a des années.
Java EE 7 a finalement fait la même chose et permet maintenant aux méthodes de bean CDI d'être transactionnelles, en plus des méthodes EJB. Donc depuis Java EE 7, il définit également sa propre annotation transactionnelle (elle 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 l'annotation Spring.
Leur utilisation est la même: informer le conteneur (Java EE ou Spring) qu'une méthode est transactionnelle.
Une autre différence est la façon dont Spring gère les annotations @Transactional
- org.springframework.transaction.annotation.Transactional est toujours pris en compte
- javax.transaction.Transactional est pris en compte uniquement lorsque des transactions EJB3 sont présentes. La présence des transactions EJB3 est effectuée 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 non prises en compte si seulementjavax.transaction.Transactional
est dans votre chemin de classe et pasjavax.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 pasjavax.ejb.TransactionAttribute
.
S'il vous plaît soyez prudent, (ce problème est arrivé à Tomcat),
Si votre application est une application Web SPRING et que vous utilisez le mécanisme de traitement des transactions de Spring, @org.springframework.transaction.annotation.Transactional
, alors ne le mélangez pas avec javax.transaction.Transactional.
C'est toujours utiliser, @org.springframework.transaction.annotation.Transactional
dans une application de printemps de manière cohérente.
Sinon, nous pourrions 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]