jpa实体管理器

来源:互联网 发布:popsub mac 编辑:程序博客网 时间:2024/06/05 02:39
实体管理器:
jpa有三种不同类型的实体管理器。
1容器托管的实体管理器
获取方式@PersistenceContext,是容器管理实体管理器的生命周期。容器托管的实体管理器分为2类,
一个是是事务范围的,意味着由实体管理器管理的持久化上下文的范围限定在活动的jta事务中,当事务完成时结束。
第二个是扩展的,扩展的实体管理器使用一个单一的持久化上下文,其绑定一个有状态会话bean的生命周期,以那个有状态会话


bean的生命为范围,可跨多个事务。
在有状态会话bean中,默认的实体管理器是事务范围的,每个方法是一个事务,第一个方法结束后,持久化上下文消失,实体还存


在,但是无法持久化,这种状态是实体与持久化上下文分离状态。
扩展的实体管理器就是要解决上面的问题的。专门针对有状态会话bean,防止事务结束时实体与上下文分离。


@stateful
public class departmentmanagerbean implements departmentmanager{
@persistenceContext(unitName="employeeservice",type=persistenceContexttype.extend)
EntityManager em;
Department dept;
public void init(int deptId){
dept = em.find(department.class,deptid);
}


public void setName(String name){
dept.setName(name);
}


//...


persistenceContext中的type默认是transaction类型的,也就是事务范围的实体管理器。
事务范围的实体管理器的持久化上下文(其在事务开始时开始,并且持续到事务结束),扩展的实体管理器的持久化上下文会在整


个会话期间持续。扩展实体管理器的最大局限性在于它需要一个有状态会话bean。




应用程序托管的实体管理器
指的就是由应用程序来管理实体管理器的生命周期。获取的方法是有entitymanagerfactory调用createentitymanager()方法创建


的。这种情况下的实体管理器,需要手工的关闭。em.close();
应用程序托管的实体管理器在java ee中的角色有些特别。如果一个操作需要资源本地的事务,那么应用程序托管的实体管理器将


是唯一可用的实体管理器类型???


jpa支持两种类型的事务管理。第一种是资源本地的事务,是由持久性单元引用的jdbc驱动程序的本地事务。第二种事务管理类型


是jta事务,是java ee服务器的事务,支持多种参与的资源,事务生命周期管理和分布式xa事务。




容器托管的实体管理器总是使用jta事务,而应用程序托管的实体管理器可以使用两种类型。java ee应用程序的默认和首选的事务


类型是jta。


jta事务管理
事务同步,事务关联以及事务传播之间的差异。
事务同步是指使用事务注册持久化上下文的过程,使得持久化上下文可以在一个事务提交的时候获得通知。
事务关联是持久化上下文绑定到一个事务的行为,
事务传播是在单个事务内多个容器托管的实体管理器之间共享一个持久化上下文的过程。


事务范围的持久化上下文
事务范围的实体管理器负责在需要时自动创建事务范围的持久化上下文。事务范围的持久化上下文是延迟创建的。




扩展的持久化上下文




持久化上下文冲突
在有事务范围的实体管理器的无状态会话bean创建了一个新的持久化上下文,然后再拥有扩展的持久化上下文的有状态会话bean上


调用了一个方法,在扩展的持久化上下文的即时关联期间,容器检查是否已经有活动的持久化上下文。如果有,那么必须与正试图


关联的扩展持久化上下文相同,否则抛出一个异常。这个例子中,有状态会话bean将会发现由无状态会话bean创建的事务范围的持


久化上下文,因此调用有状态会话bean方法时将会失败。


有状态bean在java ee





0 0
原创粉丝点击