@PersistenceUnit
可以与JPA中的JTA一起使用吗?如果是这样,怎么可能?
根据http://tomee.apache.org/jpa-concepts.html:
使用<persistence-unit transaction-type="RESOURCE_LOCAL">
[...]
您必须使用EntityManagerFactory来获得EntityManager
[...]
只能通过@PersistenceUnit注释(而不是@PersistenceContext)注入EntityManagerFactory。
使用<persistence-unit transaction-type="JTA">
[...]
只能通过@PersistenceContext注释(而不是@PersistenceUnit)注入EntityManager。
我有一个类似的代码,它同时使用JTA和@PersistenceUnit
。但是有时在进行事务处理时定义为NullPointerException
(定义为@Resource
)。
最佳答案
使用JTA意味着您将工作委托给了容器。您可以使用UserTransaction
覆盖它。您的报价包含您想知道的所有答案。使用PersistenceUnit
获取EntityManager
无效。
如果使用的是RESOURCE_LOCAL
,则使用EntityManager.getTransaction()
负责事务本身。实体管理器由EntityManagerFactory
创建。要获得该工厂,可以使用PersistenceUnit
。
因此,如果您依赖容器管理的实体管理器,那么简单的答案是“否”。
例如,请参见http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html
应用程序管理的实体管理器= RESOURCE_LOCAL
可以使用UserTransaction
(属于JTA)。