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事务之外保存数据。@PascalEntityManager
与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();