繁体   English   中英

什么是持久化上下文?

[英]What is Persistence Context?

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

谁能用简单的外行术语解释一下? 它与@Entity使用的数据有什么关系?

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

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

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

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

  1. 实体由javax.persistence.EntityManager实例使用持久化上下文管理。
  2. 每个EntityManager实例都与一个持久化上下文相关联。
  3. 持久化上下文中,实体实例及其生命周期受到管理。
  4. 持久化上下文定义了一个范围,在该范围内创建、持久化和删除特定实体实例。
  5. 一个持久化上下文就像一个缓存,其中包含一组持久化实体,因此一旦事务完成,所有持久化对象都从EntityManager 的持久化上下文中分离,不再被管理。

取自页面:

这是 JPA 世界的快速备忘单:

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

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

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

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

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

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

在此处参考 JPA 定义

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

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

持久化上下文可以是事务范围的——持久化上下文在事务的长度内“存在”,或者扩展——持久化上下文跨越多个事务。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM