首页 文章

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

提问于
浏览
8

对该主题的各种部分描述使我怀疑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 回答

  • 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规范) . 如果那里写的东西不起作用,请考虑(并且请报告!)这是一个错误 .

相关问题