JPA EntityManager详解(3/3)

3.   容器管理的事务 之 应用程序管理的持久化上下文

Ø 应用程序管理的持久化上下文与容器管理的持久化上下文的一个最大的区别是:只能有一个容器管理的持久化上下文与事务关联,但是可以有任意多个应用程序管理的持久化上下文与当前事务关联。
Ø 应用程序管理的持久化上下文有两种方式加入JTA事务:
ü 如果持久化上下文是在事务内部创建的,则持久化提供者自动将该持久化上下文关联到当前事务;
ü 如果持久化上下文不是在本事务内部创建的(比如在另一个已经结束的事务中创建的),则需要调用EntityManager.joinTransaction()方法手动将持久化上下文与事务绑定。
Ø 由于应用程序管理的EntityManager不会自动传播,唯一与其他组件共享受管实例的方法是共享EntityManager实例。并且在不同的事务当中使用EntityManager时必须先要调用joinTransaction()方法。
Ø 对于应用程序管理的EntityManager而言,可以在事务结束前关闭EntityManager,这样EntityManager实例就无法使用了,但是之前做的操作在事务结束时仍然会同步到数据库。因为持久化上下文会存活到事务结束。
Ø 由于在同一个JTA事务当中可以存在多个持久化上下文,所以当事务提交时,可能若干持久化上下文同时执行flush操作,这样会存在隐性问题,比如,如果一个实例存在于多个持久化上下文中,flush的结果会如何?结果是无法预料的。因此应该避免在同一事务中将一个实例加入多个持久化上下文。

4.   本地资源事务(RESOURCE_LOCAL Transaction

Ø 本地资源事务是指通过调用EntityManager.getTransaction()管理的事务。其实质是使用Connection来管理事务。

5.   其他

Ø 当事务回滚时,持久化上下文会将所有托管对象清空,亦即调用EntityManager.clear()方法。如果持久化上下文是事务范围的,那么该持久化上下文将被销毁。

你可能感兴趣的:(职场,休闲)