2013-04-05 81 views
2

只是我怎么容器管理事务的谅解澄清JPA(CMTS)工作 -容器管理事务

CMT的备用应用开始和提交事务权明确的努力吗?

CMTS能够只适用于会议和mesage驱动Bean和POJO的不?

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

回答

4

我允许自己完全重写我的答案因为它是不是在所有更糟清楚,有些东西是根本过错。

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

这里是JPA规范的相关部分:

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

[...]

两个JTA实体管理器和所需资源本地实体管理器中的Java EE Web容器和EJB容器中受到支持。在EJB环境中,通常使用JTA实体管理器。 通常,在Java SE环境中只支持资源本地实体管理器。

[...]

实体管理其交易通过JTA控制是JTA实体管理器。一个JTA 实体管理器参与当前的JTA事务,这是开始,致力于外部 实体管理器,并传播到底层资源manager.`

[...]

当使用容器管理的实体管理器,持久化上下文的生命周期始终为 ,对应用程序透明,并且持久化上下文与 一起传播JTA事务

所以,你需要定义2持久化单元只有当你想使用JTA(天气或不是容器管理)实体管理器中的Java EE应用程序。

+0

如何会话bean不是持久性单元的一部分?你究竟是什么意思?只有实体bean是持久性单元的一部分,不是吗? – bennidi 2013-04-05 10:49:02

+0

另外:交易类型RESOURCE_LOCAL/JTA是不同于CMT/BMT – bennidi 2013-04-05 10:57:37

+1

权利我混淆了两个,因为我从来没有单独使用ejb,对我来说JTA数据源和CMT走到了一起,但它似乎不是这种情况。 http://stackoverflow.com/questions/3217586/difference-between-a-jta-datasource-and-a-resource-local-datasource – Gab 2013-04-05 12:08:09

1

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

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

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

我觉得你并不真的需要改变在persistence.xml什么,但也许我错了,这里