【问题标题】:What is the relationship between BMT/CMT and an application/container-managed EntityManager?BMT/CMT 和应用程序/容器管理的 EntityManager 之间有什么关系?
【发布时间】:2015-04-03 18:27:27
【问题描述】:

对该主题的各种部分描述使我怀疑 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 与应用程序/容器管理的 EntityManager 结合起来。这仍然给我留下了关于 UserTransaction 和 BMT 之间关系的问题。一种暗示另一种吗?

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

【问题讨论】:

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


    【解决方案1】:

    我会尝试回答您的问题,但可能的场景组合比您提出的要多,因此我不会尝试回答这些问题。在容器管理的以下答案中,我的意思是 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 事务)。我没有看到任何官方示例(如果有,请在 cmets 中提供以确保完整性)。

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

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

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

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

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

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

    【讨论】:

    • 感谢您提供如此详细的回答!
    猜你喜欢
    • 2011-10-07
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多