Quelle est la différence entre @Resource UserTransaction et EntityManager?getTransaction()

quelqu'un Peut-il expliquer quelle est la différence entre :

@Resource
UserTransaction objUserTransaction;

et

EntityManager.getTransaction();

et aussi qu'est-ce que la transaction de conteneurs gérés? et comment dois-je le faire dans ma façade de session si je veux insérer trois lignes dans le tableau dans la transaction.

27
demandé sur Pascal Thivent 2010-03-25 18:52:17

3 réponses

EJB sont des composants transactionnels. La transaction peut être gérée soit par le serveur applicaiton lui - même (CMT-container - managed transaction), soit manuellement par vous-même au sein de L'EJB (BMT-bean-managed transaction).

EJB prend en charge la transaction distribuée par le biais de la spécification JTA. La transaction distribuée est contrôlée par UserTransaction , qui a des méthodes begin , commit , rollback .

avec CMT, le serveur d'application démarre, commute et fait reculer la transaction (selon les annotations de transaction ) pour vous et vous n'êtes pas autorisé à interférer. Cela signifie que vous ne devez pas accéder au UserTransaction dans ce cas. Cependant, avec BMT, vous faites cela manuellement et vous contrôlez vous-même la transaction en utilisant le UserTransaction .

passons maintenant au EntityManager . Une mise en œuvre de L'APP peut être utilisée serveur d'application ou autonome. Si vous l'utilisez en mode autonome, vous devez utiliser EntityManage.getTransaction pour délimiter vous-même la transaction JDBC. S'il est utilisé dans un serveur d'application, le EntityManager a coopéré avec le gestionnaire de transactions distribué JTA de manière transparente pour vous.

la plupart du temps, vous utilisez CMT avec @Required annotation sur la EJB. Cela signifie que vous n'avez pas besoin d'accéder à UserTransaction ou EntityManager.getTransaction . App. serveur démarre et s'engage à la transaction, mais prend également soin de la restauration si une exception est levée. C'est ce que je recommanderais pour votre façade.

(il y a plus de subtilités, telles que le PersistenceContextType ou l'engagement manuel du directeur d'entité dans la transaction distribuée avec EntityManager.joinTransaction , mais c'est seulement si vous utilisez les technologies d'une manière différente que la valeur par défaut).

26
répondu ewernli 2013-10-21 16:19:46

UserTransaction se rapporte à l'entité de transaction JTA . Vous ne pourrez l'utiliser que s'il y a un module JTA disponible dans le serveur d'application: par exemple, si vous déployez une application avec cela sur Tomcat (qui par défaut ne supporte pas JTA), le code s'appuyant sur cela échouera. Il s'agit du type de transaction par défaut utilisé dans les EJB et les BMD.

EntityManager.getTransaction() récupère une entité de transaction" locale . Il s'agit aussi parfois d'une transaction locale de ressources.

les transactions locales de ressources sont très différentes des transactions JTA: entre autres choses, les transactions locales de ressources sont spécifiques à une ressource, tandis que les transactions JTA ont tendance à être spécifiques à un fil particulier.

pour plus d'informations sur la différence entre les transactions locales de ressources et JTA, voir la réponse de stackoverflow ici: Quelle est la différence entre une JTA et une transaction locale?

7
répondu Marco 2017-05-23 12:34:15

en plus de la réponse de @Marco qui fait bien de faire la différence entre la JTA et les transactions locales de ressources.

Gérée par le Conteneur des Transactions sont [comme il est nommé] géré par le conteneur plutôt que de votre application. Ceci est fait par le niveau EJB où vous avez juste besoin d'écrire votre méthode et le conteneur enveloppera la méthode autour d'un contexte de transaction donc si une partie de votre méthode ou de ses appels de niveau inférieur jette une exception, le la transaction sera annulée.

il peut également être affiné en utilisant des annotations. Plus d'informations peuvent être trouvées ici https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html

notez que cela n'est fait que par EJBs, et les gestionnaires d'entités qui sont injectés sur le niveau web (par exemple servlets ou API REST) ne sont pas gérés par le conteneur, auquel cas vous devez rechercher la transaction en utilisant @Resource UserTransaction ou EntityManager.getTransaction , begin() et commit() vous-même.

de Java EE 6 Vous êtes autorisé à avoir EJBs à l'intérieur du niveau web donc vous n'avez pas besoin d'avoir une mise en page de projet trop complexe à moins que vous commenciez à vouloir exposer vos EJBs en tant que services web.

0
répondu Archimedes Trajano 2014-11-22 12:52:11