【发布时间】:2013-03-27 10:41:19
【问题描述】:
只是澄清一下我对容器管理事务 (CMT) 如何在 JPA 中工作的理解 -
CMT 为应用程序节省了启动和明确提交事务的工作,对吗?
CMT 只能应用于会话和消息驱动的 bean 而不能应用于 pojo?
我对上述问题的基本原理是 - 我想知道如何从 java-se 应用程序以及 java-ee 访问实体。我需要两个独立的持久性单元吗?
【问题讨论】:
标签: java jakarta-ee jpa
只是澄清一下我对容器管理事务 (CMT) 如何在 JPA 中工作的理解 -
CMT 为应用程序节省了启动和明确提交事务的工作,对吗?
CMT 只能应用于会话和消息驱动的 bean 而不能应用于 pojo?
我对上述问题的基本原理是 - 我想知道如何从 java-se 应用程序以及 java-ee 访问实体。我需要两个独立的持久性单元吗?
【问题讨论】:
标签: java jakarta-ee jpa
我允许自己完全重写我的答案,因为它根本不清楚,更糟糕的是,有些事情完全是错误的。
事实上,您(和我)正在混合使用 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 个持久性单元。
【讨论】:
CMT 是使用由 Java EE 容器评估的注释以声明方式定义的,该容器随后将透明地提供所需的事务处理。 Pojos 不是由容器管理的,所以不能应用 CMT。
至于您关于实体的问题。您应该创建一个 DAO 层来抽象出持久性逻辑的技术细节。您基本上可以使用一种通用的 dao 实现来支持 JPA。这基本上是两个环境需要不同的唯一部分。在容器中,您将免费获得注释中定义的交易。如果在标准 java se 中运行,您必须自己开始/提交/回滚您的事务。
我建议您创建一个以声明方式定义事务并期望在容器内运行的通用 dao 实现。为了在 java se 中使用,你有一个装饰器用于这个 dao,它负责正确的事务处理以模拟容器实际执行的操作。
我认为您实际上不需要更改 persistence.xml 中的任何内容,但也许我在这里错了
【讨论】: