JPA EntityManager详解(2/3)

应用程序管理的EntityManagerApplication-Managed EntityManager
Ø JavaSEJavaEE环境下建立应用程序管理的EntityManager的不一样之处,并不是建立EntityManager的方式不一样,而是得到建立EntityManagerEntityManagerFactory的方式不一样。
ü JavaSE 环境:Persistence.createEntityManager(“APU”).createEntityManager();
ü JavaEE 环境:使用@PersistenceUnit(unitName=”APU”)标注EntityManagerFactory属性。而后经过调用emf.createEntityManager()得到EntityManager。因为EntityManager是开发者显式建立并管理的,所以须要在用完以后调用em.close()方法将之关闭。EntityManagerFactory是容器注入的,不须要也不该该调用emf.close()方法。
Ø JavaSE环境下,Persistence类有两个重载的createEntityManagerFactory()方法:
ü 有一个参数:该参数表示PersistenceUnit的名字,而后使用persistence.xml中的属性建立一个EntityManagerFactory
ü 有两个参数:第一个参数的做用同上,第二个参数可让开发者设置额外的一些属性,能够做为persistence.xml中属性的扩充,若是属性的键与persistence.xml中相同,则代码中的设置覆盖persistence.xml中的配置值。
Ø 就持久化上下文而言,应用程序管理的EntityManager就像扩展的容器管理的EntityManager。当建立应用程序管理的EntityManager实例以后,该EntityManager实例当即建立一个属于它本身私有的持久化上下文,该持久化上下文将一直存活下去,直到所属的EntityManager实例销毁才消失。

4.   容器管理的事务 之 容器管理的持久化上下文

Ø JPA 支持两种事务类型:
ü 本地资源事务(RESOURCE_LOCAL):使用JDBC驱动管理的本地事务。
ü Java 事务APIJTA):可用于管理分布式事务,管理多数据源的状况。
ü 容器管理的EntityManager老是使用JTA事务。应用程序管理的EntityManager可使用本地资源事务,也可使用JTA事务。
ü JavaSE环境下,默认的事务类型是RESOURCE_LOCAL,而在JavaEE环境下,默认的事务类型是JTA
ü 事务类型在persistence.xml中定义。
Ø 只能有一个持久化上下文与JTA关联,而且只能有一个持久化上下文在事务中传播。
Ø 对于容器管理的EntityManager,在同一事务中必须使用相同的持久化上下文。
Ø 事务范围内的持久化上下文:事务范围内的持久化上下文将其生命周期绑定到某个事务,在须要的时候,事务范围内的持久化上下文由事务范围内的EntityManager负责建立,之因此说“在须要的时候”,是由于事务范围内的持久化上下文是“懒加载”的,只有在EntityManager实例调用相关的数据访问方法而且当前不存在可用的持久化上下文的时候,才会建立持久化上下文。
Ø 扩展的持久化上下文:扩展的持久化上下文与有状态会话Bean绑定。不一样于事务范围内的持久化上下文为每个事务建立一个新的持久化上下文,有状态会话Bean中扩展的EntityManager老是使用相同的持久化上下文。有状态会话Bean老是只和一个持久化上下文绑定,而且在有状态会话Bean建立时建立该持久化上下文,在有状态会话Bean销毁时注销该持久化上下文。也就是说,不一样于事务范围内的持久化上下文,扩展的持久化上下文不是“懒加载”的。
Ø 持久化上下文的冲突:当调用某个方法时有若干个持久化上下文,则会出现持久化上下文冲突,抛出异常。有个特殊状况,即在一个有状态会话Bean的扩展持久化上下文中调用另外一个有状态会话Bean的方法,而且被调用的会话Bean也使用扩展持久化上下文,这样当调用被调用的会话Bean中方法时虽有两个持久化上下文可用,但并不会出现冲突。被调用的会话Bean继承调用者的持久化上下文。
相关文章
相关标签/搜索