李文轩 2019-07-02
参考:
https://www.tutorialspoint.com/jpa/jpa_introduction.htm
https://www.tutorialspoint.com/jpa/jpa_architecture.htm
https://www.tutorialspoint.com/jpa/jpa_orm_components.htm
JPA所要解决的问题
- 减少
Java
与数据库间的数据传输的负担 - 为对象关系映射提供了一种基于 POJO 的持久化模型
JAVA对象与关系型数据库间的不对等
在关系型数据库中,对象都是以表的方式呈现的;Java对象则是以一种互联图(interconnected graph)的方式呈现。当Java程序在关系型数据库中进行读写行为时,一些不对等就会出现:
- 粒度(Granularity):Java对象一般比关系型数据库的记录有更大的粒度
- 继承(Subtypes):所有类型的关系型数据库都不支持对象的继承关系
- 唯一性(Identity):Java中靠 equals 方法检查对象唯一性,关系型数据库是靠主键
- 关联(Association): Java对象是靠引用表明对象之间的关系,关系型数据库是靠外键
- 数据导向(Data Navigation):对象之间的关系在这两个模式中都不一样
类结构
javax.persistence package以下类和接口都是被用作将 Java 实体 当作一条记录,储存到关系型数据库中。有效地减少把数据写入数据库的代码,让程序员把注意力放在业务和更重要的事情中,像是把类映射到数据库的表中。
- EntityManagerFactory: 这个是 EntityManager 的工厂类。它负责创建和管理多个 EntityManager 实体。
- EntityManager: 这个是一个接口,它负责管理 Java 对象关于持久性的操作。它就像是 Query 实体的工厂。
- Entity: 它是持久的对象,也就是一条关系型数据库的记录
- EntityTransaction: 它有着和 EntityManager 一对一的关系。每个 EntityManager 的操作都是 EntityTransaction 维护的。
- Persistence: 这个类持有获得 EntityManagerFactory 实体的静态方法
- Query: 这个接口会被 JPA 供应商实现,目的是为了获得符合标准的关系型数据库的记录(对象)
JPA类之间的关系
JPA类之间关系图- EntityManagerFactory 和 EntityManager 之间是一对多的关系。是工厂类面对多个 EntityManager 实体。
- EntityManager 和 EntityTransaction 之间的关系是一对一。每个 EntityManager 的操作都应该有个一个 EntityTransaction 的实体。
- EntityManager 和 Query 是一对多的关系。大量的 query 都能用一个 EntityManager 实体执行。
- EntityManager 和 Entity 之间是一对多的关系。一个 EntityManager 的实体可以管理多个 Entity。
Object Relation Mapping (ORM)
- ORM 是一种能够将数据从对象类型转化成关系类型(或调转)的技术。
- ORM 最主要的特性是将一个对象及其数据映射或绑定到数据库里。在映射过程中,我们需要考虑这个对象的数据,数据类型,以及它自身实体与其他表中的实体的关系。
ORM的架构
image这张图解释了对象类型的数据是如何分三个阶段储存到关系型数据库的。
- Object data 阶段(对象类型数据)
- POJO类,服务型接口和类
- 主要的业务组件层,包含各种业务逻辑与属性
- 员工例子:POJO类中可能包括一些通用属性,比如 ID,名字,薪资和岗位;还可能包括这些属性的getter和setter的方法。而 DAO/服务层的类则会包括一些员工实体的操作的方法,比如CRUD。
- 映射阶段(持久)
- 应该包括 JPA的实现方案,映射文件(ORM.xml),JPA加载器,和对象网格
- JPA实现方案:一些JPA的自定义的实现方案,像是 Hibernate 和 Mybatis
- 映射文件:包含POJO类的数据和关系型数据库中的数据之间的 mapping configuration
- JPA 加载器:像缓存一样,可以加载关系型的格状数据。它就像一个和POJO数据的服务层(类)交互的数据库复本
- 对象网格:是一个可以临时储存关系型数据的地方,像是缓存。所有对数据库的 query 都会先影响对象网格中的数据。只有在对象网格 committed之后,这些新的改变才会影响主数据库。
- Relational data 阶段(关系型数据)
- 包含着逻辑上与业务组件相连的关系型数据
- 只有在业务组件确认数据的改动后,这个阶段才会实际上改变数据库中的数据。
- 在业务组件确认之前,所有修改和查询数据的操作只会影响在这个缓存中,以网格的格式。
网友评论