2

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

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

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

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

4

2 回答 2

4

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

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

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

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

[...]

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

[...]

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

[...]

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

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

于 2013-04-05T07:18:29.487 回答
1

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

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

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

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

于 2013-04-05T10:56:42.520 回答