什么是持久性上下文?


109

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

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

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

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

Answers:


86

持久性上下文处理一组实体,这些实体保存要持久存储在某个持久性存储(例如数据库)中的数据。特别地,上下文意识到实体可以相对于上下文和基础持久性存储具有不同的状态(例如,被管理,分离)。

尽管与Hibernate相关(JPA提供程序),但我认为这些链接很有用:

http://docs.jboss.org/hibernate/core/4.0/devguide/zh-CN/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

http://gerrydevstory.com/wp-content/uploads/2012/05/jpa-state-transtition.png


嗯,这很有意义。您是否有类似的“简单”定义来说明容器管理的和应用程序管理的实体管理器之间的区别?
阿姆利特

4
容器与应用程序基本上只是告诉创建实体管理器的位置-在容器外部还是在应用程序内部。
uiron 2013年

66
  1. 实体由javax.persistence.EntityManager实例使用持久性上下文管理。
  2. 每个EntityManager实例都与一个 持久性上下文相关联。
  3. 持久性上下文中管理实体实例及其生命周期。
  4. 持久性上下文定义了一个范围,在该范围下可以创建,持久化和删除特定的实体实例。
  5. 一个持久化上下文就像是一个高速缓存包含了一组持久化实体,所以一旦交易完成,所有的持久对象从分离EntityManager的持久化上下文,并且不再管理。

1
我发现事务完成后EclipseLink不会分离实体...
Ray Hulha 2015年

容器管理的持久性上下文的缓存将仅在事务期间保留。事务中读取的实体将在事务完成后分离,并且需要合并以在后续事务中进行编辑。EclipseLink。@RayHulha
pritam kumar

4
@pritamkumar,您很好地解释了持久性上下文的概念。我要补充一点,还有javax.persistence.PersistenceContext批注,该批注用于注入EntityManager对象并建立注入对象的范围(例如,事务)。
Paulo Merson

30

取自页面:

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

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

一个PersisnteceContext可以有任何EntityManager实例吗?一个实体管理器可以具有任何PersistenceContext吗?PersisntenceContext仅适用于所有应用程序吗?
罗伯托

7

一个持续的背景下代表持有的数据和有资格像一个数据库中的一些持久性存储要永久保存的实体。一旦我们commit在与这些实体相关联的会话下进行事务处理,Hibernate就会刷新持久性上下文并将对它们的更改(insert / save,update或delete)持久化到持久性存储中。


7

这两个org.hibernate.SessionAPI及javax.persistence.EntityManagerAPI代表了处理持久性数据的上下文。

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


5

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

JPA @Entity批注指示可持久实体。

在这里参考JPA 定义


4

用外行术语来说,我们可以说Persistence Context是一个管理实体的环境,即它将“ Entity”与数据库同步。


3

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

持久性上下文可以是事务范围的-持久性上下文在事务长度内“有效”,也可以是扩展的-持久性上下文跨越多个事务。

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

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


你好,user2771889,您是对的,我没有提到持久性上下文的扩展范围。第五点与事务范围的持久性上下文有关。
pritam kumar

2

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


1
该答案与现有答案有何不同?
阿金·奥格比比尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.