-
什么是JPA
JPA(Java Persistence API,Java持久化API),定义了对象-关系映射(ORM)以及实体对象持久化的标准接口,它是一套标准,具体的实现要根据不同的厂商来提供,就跟JDBC类型
-
持久化单元
持久化单元是运行时的配置的主要单元,它定义了提供程序在程序执行期间管理持久化类所需要知道的各种信息,例如数据库链接配置,实体信息,就是在持久化单元里面配置,可以在persistence.xml对它进行配置(在Spring中就不需要)
对于每一个持久化单元,都存在一个EntityManagerFactory,所以可以将持久化单元的配置视为对于持该持久化单元的EntityManagerFactory工厂配置
每个持久化单元都必须有一个名称,这样,应用程序在指定范围内唯一的标识它
-
实体管理器
实体在数据库中真正持久化之前,需要调用一个特定的API,这个API就是由实体管理器实现,在使用实体管理器的持久化API之前,实体就是一个普通的Java对象
实体管理器是Java实体对象与数据库交互的中介,它负责管理一组对应的实体,包括这组实体的CRUD操作,实体管理器也负责与持久化上下文PersistenceContext进行交互,可以实现对实体不同状态转换的操作
通过显示的把实体作为参数传递到一个方法中调用,或者是从数据库直接读取它,实体管理器获得一个实体的引用,此时,将该对象称为由实体管理器托管
将实体管理器配置为能够持久化或管理特定类型(实体)的对象,读取他们和把他们写入到一个给定的数据库,并且它是由一个特定的持久化提供程序PersistenceProvider来实现,提供程序为整个Java持久化API提供后台实现引擎,从EntityManager到查询类以及SQL的实现
所有的实体管理器均来自EntityManagerFactory类型的工厂,实体管理器的配置是以创建它的EntityManagerFacotry为模版,但是把它单独定义为持久化单元,持久化单元隐式或显示的决定设置,特定的EntityManagerFacotry实例,的所有实体管理器上,使用的实体类都限定到该持久化单元,因此,在持久化单元及其具体的EntityManagerFactory存在一一对应关系
持久化单元为了允许区分不同的EntityManagerFacotry而对他们进行命名,从而,应用程序可以决定采用哪一个配置或者持久化单元,用于特定实体的操作
-
实体操作和生命周期
实体属于一个单一的持久化上下文,在任何给定的时间都不应该由一个以上的持久化上下文进行管理,说白了只能允许一个持久化上下文管理一个实体
新建 New–即未有id值,实体新创建,尚未与持久化上下文关联
托管 Managed–有id值,实体当前处于持久化上下文的管理之下,任何对该实体的更改都会在事务提交时自动同步到数据库
游离 Detached–有id值,实体曾经处于托管状态,但现在已从持久化上下文中分离。它不再受持久化上下文的管理,因此对实体的更改不会自动同步到数据库
删除 Removed–有id值,实体已被标记为删除。在事务提交时,它将从数据库中删除。
-
持久化上下文
实体管理器在任何给定的时间内所管理的实体对象的集合,它一般包含有当前事务范围内的,被管理的实体对象(Entity)的数据集合,称为它的持久化上下文
在使用JPA等ORM框架进行持久化时,持久化上下文是一个重要概念,它充当了应用程序和数据库之间的缓冲区,当通过ORM框架操作数据库时,实际上是与持久化上下文交互,而持久化上下文负责将这些操作转换为对应数据库的操作,而真正操作数据库的则是实体管理器
在任何时候,具有相同持久化标识(ID)的Java实例,在持久化上下文中只能存在一个,也就是ID相同的实例只能存在一个
- JPA的关系图