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