什么是持久性上下文?
我是Java世界和JPA的新手。 我正在研究JPA,遇到了很多像Entity,Persistence这样的新术语。 在阅读时,我无法理解持久性上下文的确切定义。
任何人都可以用简单的外行人来解释吗? 用什么方法处理@Entity
使用的数据?
例如,我觉得这个定义太难理解了:
持久性上下文是一组实体,这样对于任何持久性标识都有一个唯一的实体实例。
持久化上下文处理一组持有数据的实体,这些实体在持久性存储(例如数据库)中被持久化。 尤其是,上下文知道实体可以具有的上下文和底层持久性存储相关的不同状态(例如,托pipe,分离)。
虽然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
http://gerrydevstory.com/wp-content/uploads/2012/05/jpa-state-transtition.png
- 实体由使用持久性上下文的 javax.persistence.EntityManager实例pipe理。
- 每个EntityManager实例都与一个 持久性上下文相关联。
- 在持久化上下文中 , pipe理实体实例及其生命周期。
- 持久性上下文定义了一个范围,在该范围下创build,保持和移除特定的实体实例。
- 持久化上下文就像一个包含一组持久化实体的caching ,所以一旦事务完成 ,所有持久化对象都将从EntityManager的持久化上下文中分离出来,不再被pipe理。
采取从这页:
这是一个JPA世界的快速备忘单:
- 高速caching是数据的副本,复制的意思是从数据库中移出来的。
- 刷新caching是将修改的数据放回到数据库中的行为。
- PersistenceContext本质上是一个Cache。 它也往往有它自己的非共享数据库连接。
- 一个EntityManager表示一个PersistenceContext(因此是一个Cache)
- 一个EntityManagerFactory创build一个EntityManager(以及一个PersistenceContext / Cache)
org.hibernate.Session API和javax.persistence.EntityManager API都代表了处理持久数据的上下文。 这个概念被称为持久性上下文。 持久性数据具有与持久性上下文和基础数据库相关的状态。
虽然@pritam kumar给出了一个很好的概述,第五点是不正确的。
持久性上下文可以是事务作用域(Persistence Context),持久性上下文(Persistence Context)在事务的长度上是“生命的”,或者持久性上下文(Persistence Context)跨越多个事务。
https://blogs.oracle.com/carolmcdonald/entry/jpa_caching
JPA的EntityManager和Hibernate的会话提供了一个扩展的持久性上下文。
持久性上下文表示持有数据的实体,并且有资格在像数据库这样的持久性存储中持久化。 一旦我们在有这些实体附加的会话下提交事务,Hibernate就会刷新持久化上下文,并对其进行更改(插入/保存,更新或删除),并持久存储。
“在给定的时间由一个实体pipe理器实例pipe理的一组持久化(实体)实例”被称为持久化上下文。
JPA @Entity注释表示一个可持久的实体。
请参阅JPA 定义