应用程序与容器管理的EntityManager

时间:2011-12-08 13:55:31

标签: java jpa 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的用途和区别是什么?

2 个答案:

答案 0 :(得分:18)

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

你打电话:

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

如果成功,您将确保致电

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

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

entityManager.getTransaction().rollBack();

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

您只需要指定。

答案 1 :(得分:11)

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

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

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

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

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