一、Spring Data JPA实体概述
JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象成为JPA实体或简称实体。实体通常与底层数据库中的单个关系表相关联,当然,也有一个实体对应多个表的情况,每个实体的实例表示数据库表格中的一行。
实体与关系表类似,通常以一对一、一对多、多对多等关系彼此关联。它有三个主要的功能:
- 记录系统需要操作的结构信息。比如用户实体,它包括名称、地址、联系电话等属性,还包括唯一标识以及与其他实体的关系。
- 承载了一些具体的数据。比如从数据库查询出来的数据,以实体实例的形式存放在内存中。
- 通过实体管理器与系统交互。
二、Spring Data JPA实体管理器
1、实体管理器概述
实体管理器(EntityManager)用于管理系统中的实体,它是实体与数据库之间的桥梁,通过调用实体管理器的相关方法可以把实体持久化到数据库中,同时也可以把数据库中的记录打包成实体对象。也就是说,我们把信息存储到数据库中,或者从数据库中查询出来,都需要利用实体管理器。
实体管理器提供了一系列的方法来操作实体,要掌握实体管理器的用法,还必须要了解一个重要的概念——实体生命周期。它是指实体从创建到销毁,在实体管理器各个方法的控制下呈现出来的状态。
我们通过一幅图来了解实体的生命周期及实体管理器如何控制实体。
从图中我们可以看到,一个实体的生命周期有四种状态:新建状态、托管状态、游离状态和删除状态。
新建状态:刚创建出来的实体对象处于新建状态,和创建一个简单的Java对象一样,通常是使用new操作来创建。
托管状态:对新建实体对象的各个属性赋值以后,调用实体管理器的persist持久化方法,可以让实体状态迁移到托管状态。
在这个过程中系统会执行数据库插入语句把数据持久化到数据库中,同时标记实体为托管状态。处于托管状态的实体,如果我们修改了实体的属性,事务提交以后,这些改变会自动提交到数据库中。
托管状态标志着实体正在被实体管理器管理,处于托管状态的实体,当我们提交事务时,实体的状态就变成了游离状态。
游离状态:此时修改实体的属性是不会触发数据库操作,这种状态和新建状态很相似,区别在于游离状态的实体中ID属性是有值的,而新建状态的实体通常是没有的。
除了提交事务可以让托管状态的实体变为游离状态以外,还可以调用实体管理器的close方法、clear方法或者detach方法使实体变为游离状态。其中close方法是关闭实体管理器,clear方法是让实体管理器管理的所有实体都变成游离状态,detach可以使单个实体变成游离状态。
删除状态:处于托管状态的实体可以删除,通常可以调用实体管理器的remove方法,实体的状态会立即变成删除状态,表示某个实体已经准备好被删除,此时系统不会实际删除数据库中的记录,需要提交事务才能真实的删除。
2、实体管理器的常用方法
-
persist方法详解
对于不同状态下的实体,persist操作结果如下:
新建状态:实体状态迁移到托管状态。
托管状态:实体状态不发生改变,但会执行数据库的insert操作。
游离状态:方法的调用将会抛出异常信息。
删除状态:实体将重返托管状态。 -
merge方法详解
对于不同状态下的实体,merge操作结果如下:
新建状态:系统会执行数据库insert操作,同时返回一个托管状态的实体。
托管状态:实体状态不发生改变。
游离状态:系统将实体的修改保存到数据库,同时返回一个托管状态的实体。
删除状态:方法调用将抛出异常。 -
refresh方法详解
对于不同状态下的实体,refresh操作结果如下:
新建状态:系统会执行数据库insert操作,同时返回一个托管状态的实体。
托管状态:实体状态不发生改变,但会执行数据库的update操作。
游离状态:实体状态将返回托管状态。
删除状态:方法调用将抛出异常。 -
remove方法详解
对于不同状态下的实体,remove操作结果如下:
新建状态:方法调用就抛出异常。
托管状态:实体状态变成删除状态。
脱离状态:方法调用将抛出异常。
删除状态:不发生任何操作。
三、Spring Data JPA实体基础映射
所谓实体映射,是指实体与数据库表之间的对应关系。实体的基础映射包含以下内容:
- 表映射
- 主键映射
- 字段映射和约束条件
- 单实体多表格存储
- 内嵌实体
四、Spring Data JPA实体高级映射
实体的高级映射包含以下几个部分:
- 一对一实体映射
- 一对多实体映射
- 多对多实体映射
五、Spring Data JPA实体继承
-
继承关系示例
-
实体继承的三种策略
1、单一表策略
2、连接表策略
3、每个类策略
【上一篇】:Spring Data JPA入门