什么是持久性上下文?

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

有人能用简单的外行术语解释一下吗? 这和 @Entity中使用的数据有什么关系?

例如,我发现这个定义太复杂,难以理解:

持久化上下文是一组实体,对于任何持久化标识,都有一个唯一的实体实例。

131116 次浏览

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

虽然与 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

在 JavaEE 中,持久化上下文通常通过 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

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

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

  1. 实体由 实体管理器实例 使用持久性上下文。管理
  2. 每个 EntityManager实例都与 持久性上下文相关联。
  3. 持久性上下文中,实体实例及其 管理生命周期。
  4. 持久化上下文 定义了一个 范围,在这个 范围中创建、持久化和删除 特别实体实例。
  5. 持久性上下文就像包含一组 持久性实体 cache ,所以一旦 交易完成,所有的持久对象都从 EntityManager 的持久化上下文中分离出来,不再被管理。

尽管@pritam kumar 给出了一个很好的概述,但第五点并不正确。

持久性上下文可以是事务作用域——持久性 事务长度的上下文“生存”,或者扩展——事务的 持久化上下文跨越多个事务。

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

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

持续的上下文表示持有数据的实体,这些实体有资格像数据库一样持久存储在某些持久存储中。一旦我们 commit会话下的一个事务附加了这些实体,Hibernate 刷新持久上下文和它们上面的更改(插入/保存、更新或删除)就会保持在持久存储中。

摘自 这个页:

这里有一个 JPA 世界的小抄:

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

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

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

参考 JPA 定义在这里

通俗地说,我们可以说持久化上下文是一个管理实体的环境,即它将“实体”与数据库同步。

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