Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “a”与“a”之间的区别;jta数据源“;及;“本地资源”;数据源?_Java_Jpa_Jakarta Ee_Ejb 3.0_Jta - Fatal编程技术网

Java “a”与“a”之间的区别;jta数据源“;及;“本地资源”;数据源?

Java “a”与“a”之间的区别;jta数据源“;及;“本地资源”;数据源?,java,jpa,jakarta-ee,ejb-3.0,jta,Java,Jpa,Jakarta Ee,Ejb 3.0,Jta,术语“jta数据源”和“资源本地数据源”对我来说有点模糊。我正在写下我所理解(或假设)的内容,我希望你说出我的对/错 同一数据库可以称为jta数据源或资源本地数据源 如果提到jta数据源,那么bean/其他类可以使用jta。因此,用户事务接口 如果数据源是本地资源,则无法使用/ 如果被称为资源本地数据源,则事务不知道JTA。代码可以使用EntityTransaction接口,但不能使用UserTransaction接口 谢谢 “jta数据源”和“资源本地数据源”这两个术语对我来说有点模糊 我

术语“jta数据源”和“资源本地数据源”对我来说有点模糊。我正在写下我所理解(或假设)的内容,我希望你说出我的对/错

  • 同一数据库可以称为jta数据源或资源本地数据源
  • 如果提到jta数据源,那么bean/其他类可以使用jta。因此,用户事务接口
  • 如果数据源是本地资源,则无法使用/
  • 如果被称为资源本地数据源,则事务不知道JTA。代码可以使用EntityTransaction接口,但不能使用UserTransaction接口
谢谢

“jta数据源”和“资源本地数据源”这两个术语对我来说有点模糊

我猜您实际上指的是
jta数据源
非jta数据源
元素。简言之:

  • 如果持久化单元的事务类型是JTA,则使用
    JTA数据源
    元素声明将用于获取连接的JTA数据源的JNDI名称。这是常见的情况
  • 如果持久化单元的事务类型是resource local,则应使用
    非jta数据源
    来声明非jta数据源的JNDI名称
  • 同一数据库可以称为jta数据源或资源本地数据源
这是正确的。我没有在上面提到,但一些提供商甚至允许声明一个
jta数据源和一个
非jta数据源,并使用后者通过非jta连接进行优化读取(即,它不会与正在进行的jta事务相关联)

  • 如果提到jta数据源,那么bean/其他类可以使用jta。因此,用户事务接口
第一部分是正确的,最后一部分不是完全正确的。从EJB3.0规范第13.3.4节“使用容器管理事务划分的企业bean”:

企业bean的业务方法[…]不能试图获取或使用
javax.transaction.UserTransaction
接口

以及第16.12节用户事务接口:

容器不能使
UserTransaction
接口可供不允许使用此接口的企业bean使用

换句话说,
UserTransaction
接口对CMT企业bean不可用

  • 如果数据源是本地资源,则无法使用CMT/BMT
这里的措辞有点混乱,但我要说的是,这并不完全正确。根据JPA 1.0规范第5.5节“控制交易”:

应用程序管理的实体管理器可以是JTA实体管理器或资源本地实体管理器

JTA实体管理器和资源本地实体管理器都需要在javaeeweb容器和EJB容器中得到支持。在EJB环境中,通常使用JTA实体管理器

第6.2.1.2节交易类型

事务类型
属性用于指定实体管理器工厂为持久化单元提供的实体管理器必须是JTA实体管理器还是资源本地实体管理器。此元素的值为
JTA
RESOURCE\u LOCAL
。JTA的事务类型假定将提供JTA数据源—由
JTA数据源
元素指定或由容器提供。通常,在JavaEE环境中,
RESOURCE\u LOCAL的
事务类型
假定将提供非JTA数据源。在JavaEE环境中,如果未指定此元素,则默认为JTA

因此,您可以使用应用程序管理的实体管理器,它可以是资源本地实体管理器(在这种情况下,您必须注入
EntityManagerFactory
以从中获取EM),并且它不会成为JTA事务的一部分。看

  • 如果被称为资源本地数据源,则事务不知道JTA。代码可以使用EntityTransaction接口,但不能使用UserTransaction接口

同样,措辞有点混乱,但我认为这是正确的。

您好,非常感谢您花时间解释清楚!!!我现在看到我们使用术语“资源本地EntityManager”,而不是“资源本地数据源”。是的,我说的“资源本地数据源”是指非jta数据源。这就是我现在的理解:EntityManager的JTA/RESOURCE_LOCAL-->事务类型。确定谁控制基础事务。JTA/EntityTransaction API JTA EntityManger:容器是否管理此EntityManager。参与JTA交易。JTA事务可以是CMT或BMT。可在托管类中使用。Resource-Local EntityManager:容器不管理EnityManager。涉及非JTA交易。使用EntityTransaction API。可以在用于BMT的POJO中使用,UserTransaction始终使用jta数据源,也不能在CMT中使用非jta数据源,容器只能使用jta-datasource@stratwine:不客气,很高兴你发现它很有用(而且你的理解看起来是正确的)。关于措辞,我并不想挑剔,但由于规范定义了一个非常精确(和微妙)的术语,使用它会使沟通更容易,这就是为什么我坚持要这样做(我建议阅读我引用的部分章节)。@PascalThivent“这个(非常有趣的)讨论”的链接不起作用,你指的是以下几点吗?