Java 应用程序与容器管理的EntityManager

Java 应用程序与容器管理的EntityManager,java,jpa,entitymanager,Java,Jpa,Entitymanager,我目前在理解JPA的概念方面有问题 我目前正在使用/开发最近的EclipseLink、Glassfish、Derby数据库来演示一个项目 在我从更大的角度开发一些东西之前,我需要绝对确定这个持久单元在不同的范围内是如何工作的 我有很多servlets 3.0,目前正在request.session对象中保存用户关联的实体类(所有内容都在同一个war文件中)。我目前正在使用EntityManagerFactory和UserTransaction注入来使用应用程序管理的EntityManager。经

我目前在理解JPA的概念方面有问题

我目前正在使用/开发最近的EclipseLink、Glassfish、Derby数据库来演示一个项目

在我从更大的角度开发一些东西之前,我需要绝对确定这个持久单元在不同的范围内是如何工作的

我有很多servlets 3.0,目前正在request.session对象中保存用户关联的实体类(所有内容都在同一个war文件中)。我目前正在使用EntityManagerFactory和UserTransaction注入来使用应用程序管理的EntityManager。经本人测试,工作平稳。当两个人同时访问相同的实体时,会出现不同版本的实体。如果可能的话,我想在同一个战争、同一个持久性单元中使用托管bean

我读了很多关于这些范围的解释,这些解释对我来说毫无意义


长话短说,应用程序和容器管理的EntityManager的用法和区别是什么?

当你说应用程序管理的事务时,它意味着处理事务的是你的代码。简言之,它意味着:

你打电话:

entityManager.getTransaction().begin(); //to start a transaction
如果成功了,你一定要打电话

entityManager.getTranasaction().commit(); //to commit changes to database
或者,如果出现故障,您将确保拨打:

entityManager.getTransaction().rollBack();
现在假设您有一个容器,它知道何时调用
begin()
commit()
rollback()
,这是容器管理的事务。代表您处理交易的人


您只需要指定它。

容器管理的事务(CMT)可以被视为一种声明性事务,在这种情况下,事务管理被委托给容器(通常是EJB容器),并且可以简化许多开发工作

如果我们在一个带有EJB容器的JavaEE环境中,我们可以直接使用CMT

如果我们在JavaSE环境中,或者在没有EJB容器的JavaEE环境中,我们仍然可以利用CMT,一种方法是使用Spring,它使用AOP实现声明式事务管理;另一种方法是使用Guice,它使用PersistFilter来实现声明性事务

在CMT中,容器(无论是EJB容器、Spring还是Guice)将负责事务传播和提交/回滚工作


应用程序管理事务(AMT)与CMT的不同之处在于,我们需要在代码中以编程方式处理事务。

您所说的“现在假设您有一个容器,谁知道何时调用being、commit或rollback,这是容器管理的事务。有人代表您处理事务。”?容器就像Spring,在配置bean时,指定什么是事务实体,就像配置实体bean一样,指定bean为@Transactional,事务由Spring处理。我发现了一个问题,它反映了我所搜索的内容——“应用程序和容器管理的实体管理器的用法和差异”,只是发现被接受的答案谈论了一些不同的东西——容器和应用程序处理的事务。最重要的是,答案以“When you say application managed transaction”(当您说应用程序管理的事务时)开头,OP没有这样说。答案很好,但不要忘记,每个正式的JavaEE环境都有一个EJB容器。否则它就不能称为JavaEE(Tomcat因此不是一个正式的JavaEE环境)。同样,在JavaEE中,CMT的对立面称为BMT;Bean管理的事务。非常感谢您对这个答案的补充。