繁体   English   中英

容器管理的交易

[英]Container-Managed Transactions

请澄清一下我对JPA中容器管理的交易(CMT)的工作方式的理解-

CMT可以使应用程序省去启动和提交事务的工作,对吗?

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

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

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

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

这是JPA规范的相关部分:

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

[...]

Java EE Web容器和EJB容器均需要同时支持JTA实体管理器和资源本地实体管理器。 在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中的任何内容,但也许我在这里错了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM