一、简介
JPA(java持久化API)以Enitity为核心,主要功能是将实体映射到底层数据库表,然后通过在应用程序中使用JPA的EntityManager来操作Entity,而JPA实现则将这种操作转换为对底层数据表的操作。
JPA是规范,并不是任何具体的ORM框架,所以在系统中使用JPA时,只是用的规范,具体还是会有一种ORM的实现,例如Hiernate,TopLink等。
如图所示是JPA和ORM框架之间的关系
二、JPA规范简介
JPA操作过程中,最常用的三种组件:
1、实体
实体其实就是一个普通的POJO(简单的Java对象(Plain
Old Java Objects)实际就是普通JavaBeans)只是为它增加了orm.xml映射文件或Annotation,通过使orm.xml映射文件或注解即可创建实体和底层数据表之间的对应关系。
2、EntityManger
实体只是和底层数据表具有映射关系的简单java对象,本身并没有任何持久化的能力,只有使用EntityManager来对实体进行操作室,JPA规范才可以将这种操作转换为对底层数据库的操作,所以EntityManger的作用类似于Hibernate框架中的Session。
3、JPQL查询
类似于Hibernate提供hql查询一样,JPA提供了JPQL查询语句,查询语句简单易用,可以非常方便地检索以保存的的实体。JPA提供了一个Query接口来执行查询,EntityManager根据已有的JPQL来创建Query对象,然后由Query对象来执行查询。
三、JPA规范中的实体
在JPA规范中涉及两个常用的概念,持久化上下文(persistence
context)和持久化单元(persistence unit)
1、持久化上下文
持久化上下文是一组处于托管状态下实体所组合的集合,它处于EnitityManager的管理之下,因此应用程序可以通过EntittyManager与持久化上下文进行交互,当应用程勋改变了持久化上下文中的实体状态后,EntityManager将会根据指定的flush模式将实体的状态写进底层数据库。
2、持久化单元
持久化单元是由配置文件定义的。我理解的也不是很多,以后再做详细介绍。
3、实体的状态
与hibernate类似,JPA规范中的实体也有几种对象状态
(1)新建:实体有new操作创建,但是还没有与EntityManger关联过的实体被认为处于新建的状态,新建状态不会被持久化到数据库中。
(2)托管:托管状态下的实体在数据库中有对应的记录,并拥有一个持久化标识,托管状态下的实体可以是刚刚保存的,也可以是刚刚被加载的,无论哪一种,托管实体都是在EntityManager的管理之下的,JPA会自动检测处于托管状态下实体的改动,当程序修改托管实体的属性时,JPA负责将这种修改转换为对数据库记录的修改。
(3)脱管:如果一个实体曾经处于托管状态,那么他是有一个持久化标识的,但随着与之关联的EntityManager被关闭,该实体变化就成了脱管状态,脱管状态下实体的引用依然有效,只是实体脱离了EntityManager的管理。
(4)被删除:当EntityManager调用remove方法删除指定实体后,该实体进入被删除状态,被删除的实体还关联着某个持久化上下文,而且它对应的记录即将从数据库中删除。
实体状态的演化图:
关于JPA的知识还有很多,这里只是皮毛,不过和之前学过的Hibernate对比学习,也就没有那么陌生了,下次博客将会介绍jpa的映射关系。