【问题标题】:Application vs Container Managed EntityManager应用程序与容器管理的 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的用法和区别是什么?

【问题讨论】:

    标签: java jpa 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 托管事务。
    • 非常感谢您对此答案的补充。
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2010-11-21
    • 2012-12-10
    • 2013-09-24
    相关资源
    最近更新 更多