Transaction-scoped Persistence上下文和Extended Persistence上下文之间有什么区别?

Muh*_*edy 41 java jpa

Transaction-scoped Persistence上下文和Extended Persistence上下文之间有什么区别?

Pas*_*ent 45

JSR-220 Enterprise JavaBeans 3.0规范中清楚地解释了这种差异:

5.6容器管理的持久性上下文

(......)

容器管理的持久性上下文可以定义为具有作用于单个事务的生存期或跨越多个事务的扩展生命周期,具体取决于 创建PersistenceContextType它时指定的EntityManager内容.此规范将持久性上下文分别称为 事务范围的持久性上下文扩展的持久性上下文.

(......)

5.6.1容器管理的事务范围的持久化上下文

应用程序可以通过在JNDI名称空间中注入或直接查找来获取容器管理的实体管理器,其中事务范围的持久化上下文绑定到JTA事务.实体管理器的持久性上下文类型默认或定义为 PersistenceContextType.TRANSACTION.

当在活动JTA事务的范围内调用容器管理的实体管理器[36]时,新的持久性上下文开始,并且当前没有与JTA事务关联的持久性上下文.创建持久性上下文,然后与JTA事务关联.

当关联的JTA事务提交或回滚时,持久性上下文结束,并且由EntityManager管理的所有实体都将分离.

如果在事务范围之外调用实体管理器,则从数据库加载的任何实体将在方法调用结束时立即分离.

5.6.2容器管理的扩展持久化上下文

容器管理的扩展持久性上下文只能在有状态会话bean的范围内启动.它存在于PersistenceContextType.EXTENDED 创建声明对类型的实体管理器的依赖的有状态会话bean的点,并且被称为绑定到有状态会话bean.通过PersistenceContext注释或persistence-context-ref部署描述符元素声明对扩展持久性上下文的依赖性 .

@Remove 有状态会话bean 的方法完成时(或者有状态会话bean实例被破坏),容器将关闭持久性上下文.

(......)


mik*_*ika 7

有许多细节要尊重......但为了保持简短,我记得这样的差异:

事务范围的持久化上下文

简而言之:当调用事务范围bean上的方法时,容器将自动启动事务,并为您创建新的持久性上下文.当方法结束时,事务结束并且持久化上下文将关闭,您的实体将变为分离.

好处:此行为是无状态的,您不需要在代码中进行太多维护,并使您的EntityManager线程安全.

扩展持久化上下文

简而言之:只能用于有状态会话bean,并且与bean的生命周期相关联.持久化上下文可以在多个事务中产生,这意味着扩展bean中的方法共享相同的持久化上下文.

好处:完美实现与客户的对话风格互动.您的客户端调用几个bean方法来告诉您的bean您需要知道的所有信息,并在对话结束时将所有信息保存到您的数据库中.

重要的事情要知道

事务传播:假设事务范围bean的默认TransactionAttributes有两个方法A和B.

如果在方法A中调用方法B,则可以将A的持久化上下文传播到B.这样,方法B甚至可以访问由A创建/更改的非持久化实体,因为它们仍然由B上的持久化上下文管理.现在可以访问了.

扩展到事务范围的事务传播:您可以通过从扩展bean调用事务范围的bean的方法,将扩展bean的持久性上下文传播到事务范围的bean.使用缺省事务属性(REQUIRED),事务范围的bean将重用扩展bean的现有活动持久性上下文.

事务范围到扩展的事务传播:然而另一种方式并不直观,因为扩展的持久化上下文总是试图使自己成为活动的持久化上下文.您必须使用更改扩展bean的默认事务属性@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW).这将在扩展bean方法启动之前挂起任何活动事务(与持久性上下文关联).


小智 5

事务范围的持久化上下文

顾名思义,事务范围的持久化上下文与事务的生命周期相关联.它在事务期间由容器创建,并在事务完成时关闭.

事务范围的实体管理器负责在需要时自动创建事务范围的持久性上下文.我们只在需要时说,因为事务组合持久化上下文创建是懒惰的.

只有在实体管理器上调用方法并且没有可用的持久性上下文时,实体管理器才会创建持久性上下文.

扩展的持久性上下文

扩展持久化上下文的生命周期与绑定到的有状态会话bean相关联.

与为每个事务创建新的持久性上下文的事务范围实体管理器不同,有状态会话Bean的扩展实体管理器始终使用相同的持久性上下文.

有状态会话bean与单个扩展持久性上下文相关联,该上下文在创建bean实例时创建,并在删除bean实例时关闭.这对扩展持久化上下文的关联和传播特性都有影响.