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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

网络配置

反射错误无法设置字段值

Docker安装和常用命令

nodejs中监听文件更改(转)

Hibernate一对一双向关联(注解)

Hibernate单向关联N-N