应用程序与容器托管实体管理器

2022-09-02 12:27:45

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

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

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

我有一堆 servlet 3.0,目前将用户的关联实体类保存在 request.session 对象中(所有内容都在同一个 war 文件中)。我目前正在使用 Application-Managed EntityManager,使用 EntityManagerFactory 和 UserTransaction 注入。当由我自己测试时,它工作顺利。当 2 个人同时访问相同的实体时,会发生不同版本的实体。如果可能的话,我想使用跨同一 WAR、相同持久性单元的受管 Bean。

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

长话短说,应用和容器托管的实体管理器的用法和区别是什么?


答案 1

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

您致电:

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

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

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

或者如果发生故障,您将确保拨打:

entityManager.getTransaction().rollBack();

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

您只需要指定它。


答案 2

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

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

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

在CMT中,一个容器(无论EJB容器,Spring或Guice)将负责事务传播和提交/回滚内容;

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


推荐