什么是持久性上下文?

Posted

技术标签:

【中文标题】什么是持久性上下文?【英文标题】:What is Persistence Context? 【发布时间】:2013-11-24 15:49:43 【问题描述】:

我是 Java 世界和 JPA 的新手。我在学习 JPA 时遇到了许多新术语,例如实体、持久性。阅读时,我无法理解持久性上下文的确切定义。

任何人都可以用简单的外行术语来解释它吗?与@Entity中使用的数据有什么关系?

例如,我觉得这个定义太复杂而难以理解:

持久性上下文是一组实体,因此对于任何持久性身份,都有一个唯一的实体实例。

【问题讨论】:

【参考方案1】:

持久化上下文处理一组实体,这些实体保存要在某个持久性存储(例如数据库)中持久化的数据。特别是,上下文知道实体可以具有与上下文和底层持久性存储相关的不同状态(例如,托管、分离)。

虽然与 Hibernate 相关(一个 JPA 提供者),但我认为这些链接很有用:

http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch03.html

http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/architecture.html

在 Java EE 中,持久化上下文通常通过 EntityManager 访问。

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html

实体可以具有的各种状态以及它们之间的转换如下所述:

http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/objectstate.html

https://vladmihalcea.com/wp-content/uploads/2014/07/jpaentitystates.png

【讨论】:

嗯,现在说得通了。您是否有类似的“简单”定义来区分容器管理和应用程序管理的实体管理器? container vs application 基本上只是告诉Entity Manager的创建位置——在容器外部,或者在应用程序内部。【参考方案2】:

Persistence Context 是一个环境缓存,其中实体实例(能够保存数据并因此能够被持久化)一个数据库)由 Entity Manager 管理。它将实体与数据库同步。所有具有 @Entity 注释的对象都能够被持久化。 @Entity 只不过是一个类,它帮助我们创建对象以便与数据库通信。对象通信的方式是使用方法。提供这些方法的是实体管理器。

【讨论】:

这个答案与现有答案有何不同?【参考方案3】:

org.hibernate.Session API 和javax.persistence.EntityManager API 都表示处理持久数据的上下文。

这个概念称为持久性上下文。持久化数据具有与持久化上下文和底层数据库相关的状态。

【讨论】:

【参考方案4】:

通俗地说,Persistence Context 是一个管理实体的环境,即将“实体”与数据库同步。

【讨论】:

【参考方案5】:

持久化上下文表示持有数据并有资格在数据库等持久性存储中持久化的实体。一旦我们commit 一个会话下的事务附加了这些实体,Hibernate 刷新持久上下文并且对它们进行更改(插入/保存、更新或删除)持久化存储。

【讨论】:

【参考方案6】:

“由实体管理器实例在给定时间管理的一组可持久化(实体)实例”称为持久化上下文。

JPA @Entity 注解表示一个可持久化的实体。

请参考 JPA Definition here

【讨论】:

【参考方案7】:

取自this页面:

以下是 JPA 世界的速查表:

缓存是数据的副本,副本的意思是从数据库中提取但存在于数据库之外。 刷新缓存是将修改后的数据放回数据库的行为。 PersistenceContext 本质上是一个缓存。它还倾向于拥有自己的非共享数据库连接。 EntityManager 代表一个 PersistenceContext(因此也代表一个缓存) EntityManagerFactory 创建一个 EntityManager(并因此创建一个 PersistenceContext/Cache)

【讨论】:

一个 PersisnteceContext 可以有任何 EntityManager 实例吗?一个实体管理器可以有任何 PersistenceContext 吗? PersisntenceContext 只适用于所有应用程序?【参考方案8】:

虽然@pritam kumar 给出了很好的概述,但第 5 点是不正确的。

Persistence Context 可以是 Transaction Scoped-- Persistence 上下文“存在”事务的长度,或扩展—— 持久性上下文跨越多个事务。

https://blogs.oracle.com/carolmcdonald/entry/jpa_caching

JPA 的 EntityManager 和 Hibernate 的 Session 提供了扩展的持久性上下文。

【讨论】:

您好 user2771889,您是对的,我没有提到持久性上下文的扩展范围。第 5 点与事务范围的持久性上下文有关。【参考方案9】:
    实体由 javax.persistence.EntityManager 实例使用持久性上下文管理。 每个 EntityManager 实例都与 一个 持久性上下文相关联。 在持久性上下文中,管理实体实例及其生命周期。 持久化上下文定义了一个范围,在该范围内创建、持久化和删除特定实体实例。 持久性上下文就像一个缓存,其中包含一组持久性实体,所以一旦事务完成,所有持久化对象都从 EntityManager 的持久化上下文中分离出来,不再被管理。

【讨论】:

我发现 EclipseLink 在事务完成后不会分离实体... 容器管理的持久性上下文的缓存将仅在事务期间保留。事务中读取的实体将在事务完成后分离,需要合并才能在后续事务中进行编辑。 EclipseLink。 @RayHulha @pritamkumar,您很好地解释了持久性上下文的概念。我只是补充一点,还有 javax.persistence.PersistenceContext 注释,用于注入 EntityManager 对象并建立注入对象的范围(例如,事务)。 那么为什么这不是一个实现细节,为什么我必须手动指定我的 EntityManager 才能使用 PersistenceContext ?

以上是关于什么是持久性上下文?的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要在执行修改查询之前清除 jpa 持久性上下文?

核心数据:具有多个上下文的独立持久存储与具有单个上下文的独立持久存储

在jpa中将持久性上下文设置为只读

scala演员和持久性上下文

JPA 中的哪些操作绕过持久性上下文/缓存并直接在数据库中调用?

具有应用程序管理的持久性上下文的 Spring Boot