应用程序与容器管理的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的不同之处在于我们需要在代码中以编程方式处理事务。
- 修复Spring MVC应用程序中的Null EntityManger?
- EntityManager无法使用persist将元素保存到数据库
- entityManager.getTransaction()。rollback()分离实体?
- Java / JPA | 使用指定的inheritance类型进行查询
- 我应该经常调用EntityManager.clear()来避免内存泄漏吗?
- 如何在Spring Roo中使用JUnit测试? (EntityManager的问题)
- 如何坚持很多实体(JPA)
- 会话bean中的EntityManagerexception处理
- 我们如何才能获得JPA EntityManager Flush工作