BMT / CMT与应用程序/容器管理的EntityManager之间有什么关系?

时间:2015-02-04 09:32:16

标签: java-ee jpa transactions entitymanager bean-managed-transactions

该主题的各种部分描述使我怀疑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声称" 应用程序管理的实体管理器不会自动传播JTA事务上下文。此类应用需要手动获取对JTA事务管理器的访问权限,并且在执行实体操作时添加事务划分信息。 javax.transaction.UserTransaction接口定义了开始,提交和回滚事务的方法。通过创建使用@ Resource"注释的实例变量来注入UserTransaction的实例。对我来说,这听起来像#34;应用程序管理的实体管理器需要bean管理的事务划分"。 谁是对的? Oracle或Byteslounge?

1 个答案:

答案 0 :(得分:5)

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

  

我可以将应用程序管理的EntityManager与CMT结合使用吗?

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

7.7.1.1 Application-managed Persistence Context used in Stateless Session Bean
  

我可以将容器管理的EntityManager与BMT结合使用吗?

是的,我看过unofficial examples并且可以用来控制何时开始/提交/回滚事务,因为注入的EntityManager已自动加入事务(即你做当entitymanager加入当前的JTA事务时不控制)。我没有看到任何官方的例子(如果你这样做,请在评论中提供完整性)。

  

我可以将UserTransaction与容器管理一起使用吗?   的EntityManager?

问题没有正确提出:用UserTransaction试图控制交易,所以,正确的问题是可能的组合:UserTransaction与CMT(没有意义,因为交易是由集装箱控制的)或BMT控制的(这是典型的法律案例)。现在,您可以使用容器管理的实体管理器(取决于CMT或BMT)获得原始问题的答案。

  

UserTransaction是否意味着BMT,反之亦然?

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

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

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