对该主题的各种部分描述使我怀疑BMT与应用程序管理的EntityManager(以及UserTransaction的使用)紧密相关,并且CMT与容器管理的EntityManager紧密相关 .
任何人都可以(或指向我)清楚地解释BMT / CMT与应用程序/容器管理的EntityManager的确切关系吗?
事务划分类型和EntityManager管理类型之间允许哪些组合?
-
我可以将应用程序管理的EntityManager与CMT结合使用吗?
-
我可以将容器管理的EntityManager与BMT结合使用吗?
此外,UserTransaction和BMT / CMT与应用程序/容器管理的EntityManager之间的关系是什么?
-
我可以将UserTransaction与容器管理的EntityManager一起使用吗?
-
UserTransaction是否意味着BMT,反之亦然?
编辑:根据http://www.byteslounge.com/tutorials/container-vs-application-managed-entitymanager我可以任何方式将CMT / BMT与应用程序/容器管理的EntityManagers结合起来 . 这仍然让我有关于UserTransaction和BMT之间关系的问题 . 一个人是否意味着另一个?
编辑:与上面发布的链接相反,http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html#bnbra声称“ Application-managed entity managers 不会自动传播JTA事务上下文 . 这样的应用程序 need to manually 可以访问JTA事务管理器和 add transaction demarcation information when performing entity operations. The javax.transaction.UserTransaction interface defines methods to begin, commit, and roll back transactions . 通过创建用@注释的实例变量来注入UserTransaction的实例资源". To me this sounds like "应用程序管理的实体管理器需要bean管理的事务划分“ . Who is right? Oracle or Byteslounge?
1 回答
我会尝试回答你的问题,但是可能的情景组合比你提出的要多,我不会尝试回答它们 . 在容器管理的以下答案中,我的意思是JTA(不是RESOURCE_LOCAL),事务范围的EntityManager(注入
PersistenceContextType.TRANSACTION
而不是PersistenceContextType.EXTENDED
)是的,虽然这不是通常的用例 . 基本上,创建的实体管理器将自动加入当前事务 . 您可以在JPA 2.0规范中找到相关示例,
是的,我已经看到了unofficial examples并且可以用来仅控制何时开始/提交/回滚事务,因为注入的EntityManager已经自动加入了事务(即你不控制entitymanager何时加入当前的JTA事务) . 我没有看到任何官方的例子(如果你这样做,请在评论中提供完整性) .
问题没有正确提出:用
UserTransaction
你试图控制交易,所以,正确的问题是什么组合是可能的:UserTransaction
与CMT(没有意义,因为交易由容器控制)或BMT(这是典型的法律案例) . 现在,您可以使用容器管理的实体管理器(取决于CMT或BMT)获得原始问题的答案 .我会这么说,因为在CMT中,JTA事务是由容器自动开始的 .
对于您的上一个问题:您在Oracle网页上找到的内容对我来说似乎不对 . 正如我在第一个问题中回答的(使用官方示例),您可以在CMT中组合应用程序管理的实体管理器(无需UserTransaction,请查看规范中的示例) .
另外,我在不同的地方发现了一些其他的混淆,我认为官方文档实际上是JPA规范(以及Java EE规范) . 如果那里写的东西不起作用,请考虑(并且请报告!)这是一个错误 .