应用程序与容器管理的EntityManager

Hay*_*nce 19 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的用途和区别是什么?

mpr*_*hat 20

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

你打电话:

entityManager.getTransaction().begin(); //to start a transaction
Run Code Online (Sandbox Code Playgroud)

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

entityManager.getTranasaction().commit(); //to commit changes to database
Run Code Online (Sandbox Code Playgroud)

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

entityManager.getTransaction().rollBack();
Run Code Online (Sandbox Code Playgroud)

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

你只需要指定它.

  • 我发现了一个反映我正在搜索的内容的问题 - "应用程序和容器管理的EntityManagers的使用和差异",只是发现接受的答案是关于不同的东西 - 容器与应用程序处理_transactions_.最重要的是,答案从"当你说应用程序管理的事务"开始,OP没有说. (3认同)

aqi*_*sao 12

容器管理事务(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管理事务. (4认同)