Transaction-scoped Persistence context 和 Extended Persistence context 有啥区别?
Posted
技术标签:
【中文标题】Transaction-scoped Persistence context 和 Extended Persistence context 有啥区别?【英文标题】:What is the difference between Transaction-scoped Persistence context and Extended Persistence context?Transaction-scoped Persistence context 和 Extended Persistence context 有什么区别? 【发布时间】:2011-02-02 14:51:15 【问题描述】:Transaction-scoped Persistence context 和 Extended Persistence context 有什么区别?
【问题讨论】:
也许有帮助:tugay.biz/2017/05/extended-persistence-context-and-merge.html 【参考方案1】:JSR-220 Enterprise JavaBeans 3.0 规范中清楚地解释了区别:
5.6 容器管理的持久性上下文
(...)
容器管理的持久性 context 可以定义为具有 范围为单个的生命周期 交易或延长寿命 跨越多个交易, 取决于
PersistenceContextType
那是 当其EntityManager
为 创建的。本规范指 诸如此类的持久性上下文 事务范围的持久性上下文和扩展的持久性 上下文。(...)
5.6.1 容器管理的事务范围持久化上下文
应用程序可以获得一个 容器管理的实体管理器 事务范围的持久化上下文 绑定到 JTA 事务 在 JNDI 中注入或直接查找 命名空间。持久性上下文 实体管理器的类型是 默认或定义为
PersistenceContextType.TRANSACTION
.一个新的持久化上下文开始于 容器管理的实体管理器 在范围内调用[36] 一个活跃的 JTA 事务,以及 当前没有持久性 已经与 JTA 交易。坚持 上下文被创建然后关联 与 JTA 交易。
持久化上下文结束时 关联的 JTA 事务提交或 回滚,并且所有实体 由 EntityManager 管理成为 分离。
如果实体管理器被调用 在交易范围之外, 从数据库加载的任何实体 将立即分离 方法调用结束。
5.6.2 容器管理的扩展持久化上下文
一个容器管理的扩展 持久化上下文只能是 范围内发起的 有状态会话 bean。它存在于 有状态的点 声明一个会话 bean 对实体管理器的依赖 输入
PersistenceContextType.EXTENDED
被创建,并且据说被绑定到 有状态会话 bean。这 对扩展持久性的依赖 上下文是通过PersistenceContext
注释或 持久性上下文引用部署 描述符元素。持久化上下文被关闭 容器当
@Remove
有状态会话 bean 的方法 完成(或有状态会话 bean 实例否则会被销毁)。(...)
【讨论】:
【参考方案2】:有很多细节需要尊重......但为了简短起见,我记得这样的区别:
事务范围的持久性上下文
简而言之: 当调用事务范围 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 的现有活动持久性上下文。
从事务范围到扩展的事务传播:然而,相反的方式并不那么直观,因为扩展的持久性上下文总是试图使自己成为活动的持久性上下文.您必须使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
更改扩展bean 的默认事务属性。这将在扩展 bean 方法启动之前暂停任何活动事务(与持久性上下文相关联)。
【讨论】:
【参考方案3】:事务范围的持久化上下文
顾名思义,事务范围的持久性上下文与 交易。它由容器在事务期间创建,并在事务时关闭 完成。
事务范围的实体管理器负责创建事务范围的 需要时自动持久化上下文。我们只在需要时说,因为事务范围 持久化上下文创建是惰性的。
实体管理器只会创建持久化上下文 当在实体管理器上调用方法并且没有可用的持久性上下文时。
扩展持久性上下文
扩展持久性上下文的生命周期与其绑定的有状态会话 bean 相关联。
与事务范围的实体管理器不同,它为每个事务创建一个新的持久性上下文 事务,有状态会话 bean 的扩展实体管理器总是使用相同的持久性 语境。
有状态会话 bean 与单个扩展持久性上下文相关联,该上下文是 在创建 bean 实例时创建,并在删除 bean 实例时关闭。这有 对扩展持久性的关联和传播特性的影响 上下文。
【讨论】:
【参考方案4】:@PersistenceContext(type = PersistenceContextType.TRANSACTION)
如果我们简单地写@PersistenceContext
这和写上面的语句一样好。这一个的意思是急切地刷新(保存)对数据库的更改。
@PersistenceContext(type = PersistenceContextType.EXTENDED)
这意味着不要急于刷新(保存)对数据库的更改,而是等待下一个活动事务开始或等到强制提交触发
看看https://www.byteslounge.com/tutorials/jpa-extended-persistence-context
【讨论】:
以上是关于Transaction-scoped Persistence context 和 Extended Persistence context 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章