/**
* <pre>
* JPA(Java Persistence API,Java持久化API),定义了对象-关系映射(ORM)以及实体对象持久化的标准接口
* 什么事持久化上下文PersistenceContext?
* 在使用JPA等ORM框架进行持久化时,持久化上下文是一个重要概念,它充当了应用程序和数据库之间的缓冲区,当通过ORM框架操作数据库时,实际上是与持久化上下文交互,而持久化上下文负责将这些操作转换为对应数据库的操作
*
* 持久化单元
* 持久化单元是运行时配置的主要单元,它定义了提供程序为了在程序执行期间管理持久化类所需要知道的各种信息
* 在persistence.xml对它进行配置,对于每一个持久化单元,都存在一个EntityManagerFactory,所以可以将
* 持久化单元的配置视为对于持该持久化单元的工厂配置
* 每个持久化单元都必须有一个名称,应用程序在指定范围内唯一的标识它
*
* 实体管理器
* 实体在数据库中真正持久化之前,需要调用一个特定的API,这个API就是由实体管理器实现
* 在使用实体管理器的持久化API之前,实体就是一个普通的Java对象
*
* 通过显示的把实体作为参数传递到一个方法中调用,或者是从数据库直接读取它,实体管理器获得一个实体的引用
* 此时,将该对象称为由实体管理器托管
* 实体管理器在任何给定的时间内所管理的实体对象的集合,称为它的持久化上下文
* 在任何时候,具有相同持久化标识的Java实例,在持久化上下文中只能存在一个,也就是ID相同的实例只能存在一个
*
* 将实体管理器配置为能够持久化或管理特定类型的对象,读取他们和把他们写入到一个给定的数据库
* 并且它是由一个特定的持久化提供程序PersistenceProvider来实现
* 提供程序为整个Java持久化API提供后台实现引擎
*
* 所有的实体管理器均来自EntityManagerFactory类型的工厂,实体管理器的配置是以创建它的EntityManagerFacotry为模版
* 但是把它单独定义为持久化单元,,持久化单元隐式或显示的决定设置,特定的EMF实例的所有实体管理器上使用的实体类
* 都限定到该持久化单元,因此,在持久化单元及其具体的EntityManagerFactory存在一一对应关系
* 持久化单元为了允许区分不同的EntityMF而对他们进行命名,从而,应用程序可以决定采用哪一个配置
* 或者持久化单元,用于特定实体的操作,如下代码,实体管理器中Session中持有一个持久化上下文
* class SessionImpl implements EntityManager{
* public SessionImpl(){
* this.persistenceContext = new StatefulPersistenceContext( this );
* }
* }
*
*
*
* 实体操作
* 通过实体属于一个单一的持久化上下文,在任何给定的时间都不应该由一个以上的持久化上下文进行管理
*
* 什么是实体管理器EntityManager?
* 是Java实体对象与数据库交互的中介,它负责管理一组对应的实体,包括这组实体的CRUD操作,实体管理器也负责与持久化上下文PersistenceContext进行交互,可以实现对实体不同状态转换的操作
* 组实体 实体管理器 数据库
* EntityA
* EntityB --> EntityManager --> Mysql
* EntityC
* 负责将Java中的实体对象操作转化成数据库识别的SQL脚本,以便实现实体的持久化
* </p>
* <p>
* 持久化上下文
* PersistenceContext,称为持久化上下文,它是JPA协议定义的,它一般包含有当前事务范围内的,被管理的实体对象(Entity)的数据
* PersistenceContext中存储的是实体对象的数据,而关系数据库中存储的是记录。
* EntityManager正是维护这种OR映射的中间者,它可以把数据从数据库中加载到PersistenceContext中,也可以把数据从PersistenceContext中持久化到数据库。
* EntityManager是应用程序操纵持久化数据的接口,EntityManager的接口方法有:Persist、merge、remove、refresh、flush,
* 通过这些接口操纵PersistenceContext中的实体对象与数据库数据之间的同步!
* 离开PersistenceContext,EntityManager没有意义,如下代码,持久化上下文的生命周期和Session是一致的
*
* class SessionImpl implements EntityManager{
* public SessionImpl(){
* this.persistenceContext = new StatefulPersistenceContext( this );
* }
* }
*
*
*
* </p>
* <p>
* 实体对象的生命周期
* 新建 New–即未有id值,实体新创建,尚未与持久化上下文关联
* 托管 Managed–有id值,实体当前处于持久化上下文的管理之下,任何对该实体的更改都会在事务提交时自动同步到数据库
* 游离 Detached–有id值,实体曾经处于托管状态,但现在已从持久化上下文中分离。它不再受持久化上下文的管理,因此对实体的更改不会自动同步到数据库
* 删除 Removed–有id值,实体已被标记为删除。在事务提交时,它将从数据库中删除。
* </p>
* <p>
* 实体元数据
* 除了实体的持久化状态,每个实体都包含一些相关的元数据,即使是非常上来描述它,这些元数据
* 可能作为保存的的类文件一部分存在,或者可能在类的外包存储,但不是保存在数据库中
* 元数据使得持久化层从加载到运行时调用实体,均能识别,解释以及正确的管理它们
* </p>
* <p>
* 实体元模型
* 持久化单元的元模型描述了持久化类型,状态,实体的关系,可嵌入的对象以及托管类
* 通过它,我们可以在运行时查询持久化提供程序,来找出持久化单元中类的信息
* 从名称,类型到关系,都可以通过元模型(MetaModel)Api来访问,它是一个关于
* 持久化类型有用的信息源
* </p>
* </pre>
*/
JPA的基本概念
最新推荐文章于 2024-07-31 19:38:21 发布