应用程序与容器管理的 EntityManager
Posted
技术标签:
【中文标题】应用程序与容器管理的 EntityManager【英文标题】:Application vs Container Managed EntityManager 【发布时间】:2012-01-15 22:50:42 【问题描述】:我目前在理解 JPA 的概念方面存在问题。
我目前正在使用/开发最近的 EclipseLink、Glassfish、Derby 数据库来演示一个项目。
在我开发更大范围的东西之前,我需要绝对确定这个 PersistingUnit 在不同范围内的工作方式。
我有一堆 servlet 3.0,目前将用户的关联实体类保存在 request.session 对象中(所有内容都在同一个 war 文件中)。我目前正在使用使用 EntityManagerFactory 和 UserTransaction 注入的应用程序管理的 EntityManager。自己测试时运行流畅。当 2 个人同时访问相同的实体时,就会出现不同版本的实体。如果可能的话,我想使用跨同一个 WAR、同一个持久性单元的托管 bean。
我已经阅读了http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html 和一堆对我来说根本没有意义的范围的解释。
长话短说,应用和容器管理的EntityManager的用法和区别是什么?
【问题讨论】:
【参考方案1】:当您说应用程序管理事务时,它意味着您的代码应该处理事务。简而言之就是:
你打电话:
entityManager.getTransaction().begin(); //to start a transaction
如果成功,您将确保调用
entityManager.getTranasaction().commit(); //to commit changes to database
或者在失败的情况下,您将确保致电:
entityManager.getTransaction().rollBack();
现在假设您有一个容器,它知道何时调用begin()
、commit()
或rollback()
,这就是容器管理事务。有人代表您处理交易。
您只需要指定。
【讨论】:
你的意思是“现在想象你有一个容器,谁知道何时调用存在、提交或回滚,这是容器管理的事务。有人代表你处理事务。”?跨度> 容器就像 Spring,你在其中配置你的 bean,你指定什么是你的事务实体,就像你配置一个实体 bean,你指定你的 bean 为 @Transactional,你的事务由 Spring 处理跨度> 我找到了反映我正在寻找的问题 - “应用程序和容器管理的 EntityManagers 的用法和区别”,却发现接受的答案谈论的是不同的东西 - 容器与应用程序处理交易。最重要的是,答案以“当您说应用程序托管事务时”开头,OP 没有说。【参考方案2】:容器管理事务(CMT)可以看作是一种声明式事务,在这种情况下,事务管理委托给容器(通常是EJB容器),可以简化很多开发工作。
如果我们在带有 EJB 容器的 Java EE 环境中,我们可以直接使用 CMT。
如果我们在 Java SE 环境,或者没有 EJB 容器的 Java EE 环境中,我们仍然可以利用 CMT,一种方法是使用 Spring,它使用 AOP 来实现声明式事务管理;另一种方法是使用 Guice,它使用 PersistFilter 来实现声明式事务。
在 CMT 中,容器(无论是 EJB 容器、Spring 还是 Guice)将负责事务传播和提交/回滚;
应用程序管理事务 (AMT) 与 CMT 的不同之处在于我们需要在代码中以编程方式处理事务。
【讨论】:
很好的答案,但不要忘记每个官方 Java EE 环境总是有一个 EJB 容器。否则不能称为 Java EE(因此 Tomcat 不是官方的 Java EE 环境)。此外,在 Java EE 中,与 CMT 相对的称为 BMT。 Bean 托管事务。 非常感谢您对此答案的补充。以上是关于应用程序与容器管理的 EntityManager的主要内容,如果未能解决你的问题,请参考以下文章
Rancher Labs联手NeuVector,提供容器管理与安全解决方案
容器技术Docker K8s 36 容器服务ACK基础与进阶-应用与发布管理
容器技术Docker K8s 35 容器服务ACK基础与进阶-应用与发布管理