BMT/CMT 和 application/container-managed EntityManager 之间有什么关系?

What is the relationship between BMT/CMT and an application/container-managed EntityManager?

对该主题的各种部分描述使我怀疑 BMT 与应用程序管理的 EntityManager(以及 UserTransaction 的使用)密切相关,而 CMT 与容器管理的 EntityManager 密切相关。

任何人都可以清楚地解释一下 BMT/CMT 与 application/container-managed EntityManager 的关系吗?

事务划分类型和 EntityManager 管理类型之间允许哪些组合?

此外,UserTransaction 和 BMT/CMT 与 application/container-managed EntityManager 之间的关系是什么?

编辑:根据 http://www.byteslounge.com/tutorials/container-vs-application-managed-entitymanager,我可以以任何我喜欢的方式将 CMT/BMT 与 application/container-managed EntityManagers 结合起来。这仍然给我留下了关于 UserTransaction 和 BMT 之间关系的问题。一个暗示另一个吗?

编辑:与上面发布的 link 相反,http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html#bnbra 声称“应用程序管理的实体管理器 不会自动传播 JTA 事务上下文. 此类应用程序 需要手动 获得对 JTA 事务管理器的访问权限,并 在执行实体操作时添加事务分界信息。 javax.transaction.UserTransaction 接口定义方法开始,提交并回滚事务。通过创建一个用@Resource 注释的实例变量来注入一个UserTransaction 实例。对我来说,这听起来像 "application-managed entity managers require bean managed transaction demarcations"。 谁是对的? Oracle 还是 Byteslounge?

我会尽力回答您的问题,但可能的情况组合比您提出的要多,我不会尝试回答它们。在容器管理的以下答案中,我指的是 JTA(不是 RESOURCE_LOCAL)、事务范围的 EntityManager(注入 PersistenceContextType.TRANSACTION 而不是 PersistenceContextType.EXTENDED

Can I combine an application-managed EntityManager with CMT?

是的,虽然这不是通常的用例。基本上创建的实体管理器会自动加入当前事务。您可以在 JPA 2.0 规范中找到一个示例,

7.7.1.1 Application-managed Persistence Context used in Stateless Session Bean

Can I combine a container-managed EntityManager with BMT?

是的,我已经看到 unofficial examples 并且只能用于控制何时 begin/commit/rollback 交易,因为注入的 EntityManager 已自动加入交易(即您无法控制何时entitymanager 加入当前的 JTA 事务)。我还没有看到任何官方示例(如果您看到,请在评论中提供它们以确保完整性)。

Can I use UserTransaction together with a container-managed EntityManager?

问题提出不正确:使用 UserTransaction 你试图控制交易,因此,正确的问题是什么组合是可能的:UserTransaction 与 CMT(这不会使感觉,因为事务由容器控制)或 BMT(这是典型的法律案例)。现在,您可以使用容器管理的实体管理器(取决于 CMT 或 BMT)获得原始问题的答案。

Does UserTransaction imply BMT and vice-versa?

我会这样说,因为在 CMT 中,JTA 事务是由容器自动启动的。

关于您的最后一个问题:您在 Oracle 的网页上找到的内容对我来说似乎不正确。正如我在你的第一个问题中回答的那样(有一个官方示例),你可以在 CMT 中组合一个应用程序管理的实体管理器(没有 UserTransaction,请查看规范中的示例)。

此外,我在不同的地方发现了一些其他的混淆,我认为官方文档实际上是 JPA 规范(以及 Java EE 规范)。如果那里写的东西不起作用,请考虑(并请报告!)它是一个错误。