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
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 seulement javax.transaction.Transactional
est dans votre chemin de classe 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
.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]