Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 @Resource UserTransaction和EntityManager.getTransaction()之间的区别是什么_Java_Jpa_Jakarta Ee_Jta - Fatal编程技术网

Java @Resource UserTransaction和EntityManager.getTransaction()之间的区别是什么

Java @Resource UserTransaction和EntityManager.getTransaction()之间的区别是什么,java,jpa,jakarta-ee,jta,Java,Jpa,Jakarta Ee,Jta,有人能解释一下这两者之间的区别吗 @Resource UserTransaction objUserTransaction; 及 还有什么是容器管理的事务?若我想在事务中的表中插入三行,那个么我应该如何在会话facade中这样做。EJB是事务组件。事务可以由应用程序服务器本身(CMT-容器管理的事务)管理,也可以由您自己在EJB中手动管理(BMT-bean管理的事务) EJB通过JTA规范支持分布式事务。分布式事务由以下方法控制:开始,提交,回滚 使用CMT,应用程序服务器为您启动、提交和回滚

有人能解释一下这两者之间的区别吗

@Resource
UserTransaction objUserTransaction;


还有什么是容器管理的事务?若我想在事务中的表中插入三行,那个么我应该如何在会话facade中这样做。

EJB是事务组件。事务可以由应用程序服务器本身(CMT-容器管理的事务)管理,也可以由您自己在EJB中手动管理(BMT-bean管理的事务)

EJB通过JTA规范支持分布式事务。分布式事务由以下方法控制:
开始
提交
回滚

使用CMT,应用程序服务器为您启动、提交和回滚事务(根据),并且不允许您进行干预。这意味着您在这种情况下不能访问
UserTransaction
。但是,使用BMT,您可以手动执行此操作,并使用
UserTransaction
自己控制事务

现在让我们转到
EntityManager
。JPA实现既可以在应用服务器中使用,也可以独立使用。如果在单机版中使用,您需要使用
EntityManage.getTransaction
自己定义JDBC事务。如果在应用服务器中使用,
EntityManager
与JTA分布式事务管理器透明地配合使用

大多数情况下,您在EJB上使用带有
@Required
注释的CMT。这意味着您不需要访问
UserTransaction
EntityManager.getTransaction
。应用程序。服务器启动并提交事务,但在引发异常时也会注意回滚。这是我为你的门面推荐的


(还有更多微妙之处,例如在分布式事务中使用实体管理器或手动登记实体管理器,但这仅限于以不同的方式使用这些技术作为默认设置)。

UserTransaction
指的是JTA事务实体。只有在应用程序服务器中有可用的JTA模块时,您才能使用此模块:例如,如果您在Tomcat上部署一个应用程序,则依赖此模块的代码将失败(默认情况下,Tomcat不支持JTA)。这是EJB和MDB中使用的默认事务类型

EntityManager.getTransaction()
检索本地事务实体。这有时也称为资源本地事务

资源本地事务与JTA事务非常不同:除其他外,资源本地事务特定于资源,而JTA事务往往特定于特定线程


有关资源本地事务和JTA事务之间差异的更多信息,请参见此处的stackoverflow答案:

除了@Marco的答案,该答案很好地说明了JTA和资源本地事务之间的差异

容器管理的事务由容器而不是应用程序管理。这是通过EJB层完成的,在EJB层中,您只需要编写方法,容器将围绕事务上下文包装方法,因此如果方法的任何部分或其低级调用引发异常,事务将回滚

还可以使用注释对其进行微调。更多信息可以在这里找到

请注意,这仅通过EJB完成,而web层上注入的实体管理器(例如servlet或REST API)不会由容器进行管理,在这种情况下,您必须使用
@Resource UserTransaction
EntityManager.getTransaction
begin()
commit()查找事务
你自己


Java EE 6允许您在web层中使用EJB,因此您不需要过于复杂的项目布局,除非您开始希望将EJB公开为web服务。

您确定
EntityManager#getTransaction()
在应用服务器中运行时与JTA分布式事务配合吗?我认为不会,我的理解是它返回一个资源本地事务,可用于在当前JTA事务之外保存数据。@Pascal
EntityManager
与JTA合作,因此您根本不应该使用
EntityManager#getTransaction
。根据javadoc,
EntityManager#getTransaction
在JTA EntityManager上调用时抛出
IllegalStateException
。事实上,
getTransaction
在JTA EntityManager上调用时抛出异常)。实际上,我想到的示例(来自“Pro JPA 2”)是在会话Bean中获得一个应用程序管理的、资源本地EM(例如,用于审计日志记录)和一个资源本地事务,您可以在JTA事务之外开始/提交任意时间。但我意识到我误读了你的答案,这与你写的不同。谢谢@对于审核,我们使用CMT和REQUIRE_NEW作为审核方法。这是AFAIK使用CMT暂停和恢复当前事务的唯一方法。这是一篇更好地了解EJB事务的好文章,IMO,一个必须阅读的EE容器管理的事务可以通过“@Transactional”注释在EJB外部使用。JTA事务不一定是CMT,因为JTA可以在应用服务器(或“容器”)之外与诸如Bitronix和Atomikos之类的库一起使用。
EntityManager.getTransaction();