只是澄清一下我对容器管理事务(CMTs)在JPA中是如何工作的理解:
CMTs使应用程序不必显式地开始和提交事务,对吗?
CMTs只能应用于会话和消息驱动的bean,而不能应用于pojos?
我回答上述问题的基本原理是--我想知道如何从java-se应用程序以及java-ee访问实体。我需要两个独立的持久化单元吗?
发布于 2013-04-05 15:18:29
我允许自己完全重写我的答案,因为它根本不清楚,更糟糕的是,有些东西根本就是错误的。
事实是,您(和我)混淆了EJB和JPA术语。
JPA只是在谈论实体bean。会话bean (包括CMT和BMT)是EJB规范的一部分。
在JPA中,我们将讨论链接到JTA或资源本地存储单元的容器管理和应用程序管理的实体管理器。
以下是JPA规范的相关部分:
JTA容器管理的实体管理器必须是
实体管理器。JTA实体管理器仅指定在Java容器中使用。应用程序管理的实体管理器可以是JTA实体管理器或资源本地实体管理器。
..。
JTA实体管理器和资源本地实体管理器都需要在Java web容器和
容器中得到支持。在EJB环境中,通常使用JTA实体管理器。通常,在Java SE环境中,只支持资源本地实体管理器。
..。
是一个JTA实体管理器,它的事务通过JTA进行控制。JTA实体管理器参与当前JTA事务,该事务在实体管理器外部开始和提交,并传播到底层资源管理器。
..。
使用容器管理的实体管理器时,持久性上下文的生命周期始终是自动管理的,对应用程序是透明的,并且持久性上下文随JTA事务一起传播
因此,只有当您想要在java应用程序中使用JTA (天气或非容器管理)实体管理器时,才需要定义2个持久性单元。
发布于 2013-04-05 18:56:43
CMT是使用注释以声明方式定义的,这些注释由Java容器求值,然后该容器将透明地提供所需的事务处理。Pojos不是由容器管理的,因此不能应用CMT。
至于你关于实体的问题。您应该创建一个DAO层来抽象持久化逻辑的技术细节。您基本上可以使用一个通用的dao实现来支持JPA。这基本上是这两个环境中唯一需要不同的部分。在容器中,您将按照注释中的定义免费获取事务。如果在标准java se中运行,则必须自己开始/提交/回滚事务。
我建议您创建一个通用的dao实现,它以声明方式定义事务,并期望在容器内运行。为了在java se中使用,您有一个针对此dao的装饰器,它负责正确的事务处理,以模拟容器实际要做的事情。
我认为你不需要修改persistence.xml中的任何东西,但也许我错了
https://stackoverflow.com/questions/15826759
复制相似问题