任何人都可以解释有什么区别:
@Resource
UserTransaction objUserTransaction;
和
EntityManager.getTransaction();
还有什么是容器管理事务?如果我想在事务的表中插入三行,我应该如何在我的会话外观中执行此操作。
任何人都可以解释有什么区别:
@Resource
UserTransaction objUserTransaction;
和
EntityManager.getTransaction();
还有什么是容器管理事务?如果我想在事务的表中插入三行,我应该如何在我的会话外观中执行此操作。
EJB 是事务性组件。事务可以由应用服务器本身管理(CMT - 容器管理事务),也可以由您自己在 EJB 中手动管理(BMT - bean 管理事务)。
EJB 通过 JTA 规范支持分布式事务。分布式事务是使用 控制的UserTransaction
,它有方法begin
, commit
, rollback
.
使用 CMT,应用程序服务器为您启动、提交和回滚事务(根据事务注释),您不得干预。UserTransaction
这意味着在这种情况下您不能访问。但是,使用 BMT,您可以手动执行此操作,并使用UserTransaction
.
现在让我们转到EntityManager
. JPA 实现既可以在应用程序服务器中使用,也可以独立使用。如果单机使用,需要自己使用EntityManage.getTransaction
来划定JDBC事务。如果在应用服务器中使用,则EntityManager
与 JTA 分布式事务管理器透明地为您合作。
大多数时候,您@Required
在 EJB 上使用带有注释的 CMT。这意味着您不需要访问既UserTransaction
也不访问EntityManager.getTransaction
。该应用程序。服务器启动并提交事务,但如果引发异常,也会注意回滚。这就是我为你的门面推荐的。
(还有更多的微妙之处,例如PersistenceContextType
实体管理器在分布式事务中的手动登记EntityManager.joinTransaction
,但前提是您以不同的方式使用这些技术作为默认值)。
UserTransaction
指JTA事务实体。只有当应用程序服务器中有可用的 JTA 模块时,您才能使用它:例如,如果您在 Tomcat 上使用此模块部署应用程序(默认情况下不支持 JTA),依赖此模块的代码将失败. 这是 EJB 和 MDB 中使用的默认事务类型。
EntityManager.getTransaction()
检索本地事务实体。这有时也称为资源本地事务。
资源本地事务与 JTA 事务有很大不同:除其他外,资源本地事务特定于资源,而 JTA 事务往往特定于特定线程。
有关资源本地事务和 JTA 事务之间区别的更多信息,请在此处查看此 stackoverflow 答案:JTA 和本地事务之间有什么区别?
除了@Marco 的回答,它很好地说明了 JTA 和资源本地事务之间的区别。
Container Managed Transactions [顾名思义] 由容器而不是您的应用程序管理。这是通过 EJB 层完成的,您只需要编写您的方法,容器将围绕事务上下文包装该方法,因此如果您的方法的任何部分或其较低级别的调用抛出异常,事务将回滚。
它也可以使用注释进行微调。更多信息可以在这里找到https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html
请注意,这只能通过 EJB 完成,并且注入到 Web 层(例如 servlet 或 REST API)的实体管理器不会由容器管理,在这种情况下,您必须使用or 和@Resource UserTransaction
您EntityManager.getTransaction
自己来查找事务。begin()
commit()
从 Java EE 6 开始,您可以在 Web 层中使用 EJB,因此您不需要过于复杂的项目布局,除非您开始希望将 EJB 公开为 Web 服务。