Difference between UserTransaction and EntityTransaction
Title says it all: What is the difference between a UserTransaction
and an EntityTransaction
?
My rudimen开发者_如何学Gotary understanding is that UserTransaction
is used when JTA is required (e.g. to do queries on mulitple things), and that EntityTransaction
is used when JPA only is required (e.g. when the query is atomic).
Is that the only difference between the two or is there more to it than that?
My rudimentary understanding is that UserTransaction is used when JTA is required (e.g. to do queries on mulitple things), and that EntityTransaction is used when JPA only is required (e.g. when the query is atomic).
That's basically right, but your description of "multiple things" and "atomic" is a bit strange. JTA allows the developper to use distributed transaction to perform changes on multiples resources (database, JMS broker, etc.) atomically (all-or-nothing). If only one resource is accessed (e.g. one single database), you don't need JTA, but the transaction is still atomic (all-or-nothing). That's for instance the case when you use a regular JDBC transaction on one database.
Considering UserTransaction
vs. EntityTransaction
:
- If JPA is use stand-alone, you use
EntityTransaction
to demarcate the transaction yourself. - If JPA is used within a managed environment where it integrates with JTA, you use
UserTransaction
. TheEntityManager
hooks itself into the JTA distributed transaction manager. The only subtlety I'm aware of considers the flush of the changes. WhenEntityTransaction
is used, JPA know it needs to flush the changes. If transaction are controlled usingUserTransaction
, it needs to register a callback using JTAregisterSynchronization
, so that the changes are flushed to the database before the transaction completes. If you use EJB with CMT (container managed transaction), you don't even need to useUserTransaction
: the app server starts and stops the transactions for you.
Related questions:
- What is difference between UserTransaction and EntityManager.getTransaction() (duplicate)
- XA and non-XA datasource with Spring/Hibernate (related)
精彩评论