web-dev-qa-db-fra.com

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.

104
stamis

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.

88
JB Nizet

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 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.
41
Jidehem

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]
28
Lyju I Edwinson