术语“jta-datasource”和“resouce-local datasource”对我来说有点模糊。
我猜你实际上指的是jta-datasource
andnon-jta-datasource
元素。简而言之:
- 如果持久单元的事务类型是JTA,则该
jta-datasource
元素用于声明将用于获取连接的 JTA 数据源的 JNDI 名称。这是常见的情况。
- 如果持久化单元的事务类型是resource-local,则
non-jta-data-source
应该使用 来声明非 JTA 数据源的 JNDI 名称。
- 同一个数据库可以称为 jta-datasource 或资源本地数据源
这是对的。而且我没有在上面提到这一点,但是一些提供者甚至允许同时声明 ajta-datasource
和anon-jta-datasource
并使用后者来优化通过非 JTA 连接的读取(即,这不会与正在进行的 JTA 事务相关联)。
- 如果提到 jta-datasource,那么 bean/其他类可以使用 JTA。因此,UserTransaction 接口。
第一部分是正确的,最后一部分是不完全的。从 EJB 3.0 规范的13.3.4 Enterprise Beans Using Container-Managed Transaction Demarcation部分:
企业 bean 的业务方法 [...] 不得试图获取或使用javax.transaction.UserTransaction
接口。
和第16.12 节 UserTransaction 接口:
容器不得使UserTransaction
不允许使用该接口的企业 bean 可以使用该接口。
换句话说,该UserTransaction
接口对 CMT 企业 bean 不可用。
- 如果数据源是本地资源,则无法使用 CMT / BMT
这里的措辞有点令人困惑,但我想说这并不完全正确。从 JPA 1.0 规范,第 5.5 节控制事务:
应用程序管理的实体管理器可以是 JTA 实体管理器或资源本地实体管理器。
...
JTA 实体管理器和资源本地实体管理器都需要在 Java EE Web 容器和 EJB 容器中得到支持。在 EJB 环境中,通常使用 JTA 实体管理器。
和第 6.2.1.2 节事务类型
The transaction-type
attribute is used to specify whether the entity managers provided by the entity manager factory for the persistence unit must be JTA entity managers or resource-local entity managers. The value of this element is JTA
or RESOURCE_LOCAL
. A transaction-type of JTA assumes that a JTA data source will be provided — either as specified by the jta-data-source
element or provided by the container. In general, in Java EE environments, a transaction-type
of RESOURCE_LOCAL
assumes that a non-JTA datasource will be provided. In a Java EE environment, if this element is not specified, the default is JTA.
So you CAN use an application managed entity manager which can be a resource-local entity manager (you must inject an EntityManagerFactory
to get the EM from it in that case) and it won't be part of a JTA transaction. See this (very interesting) discussion.
- If mentioned as resource local datasource, transactions are not JTA aware. Code can use EntityTransaction interface but not UserTransaction interface
Again, the wording is a bit confusing but I'd say that this is correct.