【问题标题】:Container-Managed Transactions容器管理的事务
【发布时间】:2013-03-27 10:41:19
【问题描述】:

只是澄清一下我对容器管理事务 (CMT) 如何在 JPA 中工作的理解 -

CMT 为应用程序节省了启动和明确提交事务的工作,对吗?

CMT 只能应用于会话和消息驱动的 bean 而不能应用于 pojo?

我对上述问题的基本原理是 - 我想知道如何从 java-se 应用程序以及 java-ee 访问实体。我需要两个独立的持久性单元吗?

【问题讨论】:

    标签: java jakarta-ee jpa


    【解决方案1】:

    我允许自己完全重写我的答案,因为它根本不清楚,更糟糕的是,有些事情完全是错误的。

    事实上,您(和我)正在混合使用 EJB 和 JPA 术语。
    JPA 只讨论实体 bean。会话 bean(包括 CMT 和 BMT)是 EJB 规范的一部分。
    在 JPA 中,我们将讨论链接到 JTA 或资源本地持久化单元的容器管理和应用程序管理的实体管理器。

    以下是 JPA 规范的相关部分:

    容器管理的实体管理器必须是 JTA 实体管理器。仅指定 JTA 实体管理器 用于 Java EE 容器。 应用程序管理的实体管理器可以是 JTA 实体管理器或资源本地实体 经理。

    [...]

    Java EE 需要同时支持 JTA 实体管理器和资源本地实体管理器 Web 容器和 EJB 容器。在 EJB 环境中,通常使用 JTA 实体管理器。 通常,在 Java SE 环境中,仅支持资源本地实体管理器。

    [...]

    通过 JTA 控制事务的实体管理器是 JTA 实体管理器。一个JTA 实体管理器参与当前的 JTA 事务,该事务在外部开始和提交 实体管理器并传播到底层资源管理器。`

    [...]

    当使用容器管理的实体管理器时,持久化上下文的生命周期总是 自动管理,对应用程序透明,并且持久性上下文通过 JTA 交易

    因此,仅当您想在 java EE 应用程序中使用 JTA(天气或非容器管理)实体管理器时,您才需要定义 2 个持久性单元。

    【讨论】:

    • 会话 bean 怎么可能不是持久性单元的一部分?你实际上是什么意思?只有实体 bean 是持久性单元的一部分,不是吗?
    • 另外:事务类型 RESOURCE_LOCAL/JTA 与 CMT /BMT 不同
    • 对,因为我从来没有单独使用过 ejb,所以我混淆了两者,对我来说 JTA 数据源和 CMT 结合在一起,但似乎情况并非如此。 stackoverflow.com/questions/3217586/…
    【解决方案2】:

    CMT 是使用由 Java EE 容器评估的注释以声明方式定义的,该容器随后将透明地提供所需的事务处理。 Pojos 不是由容器管理的,所以不能应用 CMT。

    至于您关于实体的问题。您应该创建一个 DAO 层来抽象出持久性逻辑的技术细节。您基本上可以使用一种通用的 dao 实现来支持 JPA。这基本上是两个环境需要不同的唯一部分。在容器中,您将免费获得注释中定义的交易。如果在标准 java se 中运行,您必须自己开始/提交/回滚您的事务。

    我建议您创建一个以声明方式定义事务并期望在容器内运行的通用 dao 实现。为了在 java se 中使用,你有一个装饰器用于这个 dao,它负责正确的事务处理以模拟容器实际执行的操作。

    我认为您实际上不需要更改 persistence.xml 中的任何内容,但也许我在这里错了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多