术语“ jta-datasource”和“ resouce-local datasource”对我来说有点模糊。
我猜您实际上是指
jta-datasource和
non-jta-datasource元素。简而言之:
- 如果持久性单元的事务类型为 JTA ,则该
jta-datasource
元素用于声明将用于获取连接的JTA数据源的JNDI名称。这是常见的情况。 - 如果持久性单元的事务类型是 资源本地的 ,
non-jta-data-source
则应使用声明非JTA数据源的JNDI名称。
- 可以将同一数据库称为jta数据源或资源本地数据源
这是对的。而且我没有在上面提到过,但是一些提供程序甚至允许声明a
jta-datasource和 a,
non-jta-datasource并使用后者来通过非JTA连接优化读取(即不会与正在进行的JTA交易相关联)。
- 如果提到为jta-datasource,那么Bean /其他类可以使用JTA。因此,UserTransaction接口。
第一部分是正确的,最后一部分不是完全正确的。从EJB 3.0规范中,第 13.3.4 节“ 使用容器管理的事务划分的企业Bean” :
企业bean的业务方法不得尝试获取或使用该
javax.transaction.UserTransaction接口。
以及第 16.12 节 UserTransaction接口 :
容器不得使该
UserTransaction接口可用于不允许使用该接口的企业bean。
换句话说,该
UserTransaction接口不适用于CMT企业bean。
- 如果数据源是本地资源,则无法使用CMT / BMT
这里的措辞有点令人困惑,但我会说这并不是严格正确的。根据JPA 1.0规范,第 §5.5 节 “控制事务” :
应用程序管理的实体管理器可以是JTA实体管理器,也可以是资源本地实体管理器。
…
Java EE Web容器和EJB容器都需要同时支持JTA实体管理器和资源本地实体管理器。在EJB环境中,通常使用JTA实体管理器。
和 6.2.1.2节的交易类型
该
transaction-type属性用于指定实体管理器工厂为持久性单元提供的实体管理器必须是JTA实体管理器还是资源本地实体管理器。该元素的值是JTA或RESOURCE_LOCAL。JTA的事务类型假定将提供JTA数据源-由jta-data-source元素指定或由容器提供。在一般情况下,在Java EE环境,一个transaction-type的RESOURCE_LOCAL假设非JTA的数据源将提供。在Java EE环境中,如果未指定此元素,则默认值为JTA。
因此,您可以使用 应用程序管理的实体管理器 ,该 应用程序 可以是 资源本地的实体管理器
(
EntityManagerFactory在这种情况下,您必须注入来从中获取EM),并且它不属于JTA事务。看到这个(非常有趣的)讨论。
- 如果提到作为资源本地数据源,则事务不支持JTA。代码可以使用EntityTransaction接口,但不能使用UserTransaction接口
再次,措辞有点令人困惑,但我会说这是正确的。



