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.
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.
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 seulementjavax.transaction.Transactional
est dans votre classpath 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
.
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]