应用程序与容器管理的EntityManager

我目前在理解JPA的概念时遇到了问题。

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

在我开发更大的图片之前,我需要绝对确定这个PersistingUnit如何在不同的范围内工作。

我有一堆servlet 3.0,目前在request.session对象中保存用户的相关实体类(同一个war文件中的所有内容)。 我目前正在使用EntityManagerFactory和UserTransaction注入的应用程序管理的EntityManager。 它在我自己测试时运行顺畅。 当2个人同时访问相同的实体时,会发生不同版本的实体。 我希望使用托管bean跨越相同的WAR,如果可能的话,使用相同的持久性单元。

我已经阅读了http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html以及那些对我来说根本没有意义的范围的解释。

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

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

你打电话:

entityManager.getTransaction().begin(); //to start a transaction 

如果成功,你将确保打电话

 entityManager.getTranasaction().commit(); //to commit changes to database 

如果失败,您将确保致电:

 entityManager.getTransaction().rollBack(); 

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

你只需要指定它。

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

如果我们在具有EJB容器的Java EE环境中,我们可以直接使用CMT。

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

在CMT中,容器(无论是EJB容器,Spring还是Guice)都将处理事务传播和提交/回滚内容;

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