JPA总结

JPA 我也是最近这段时间接触框架才开始学习的,对它的理解肯定不可能很深,本文只能算对这段时间对 JPA 学习的一个总结,肯定会存在一些错误,希望朋友们可以指出,我会听取大家的意见或者建议加以改进。

JPA 介绍

JPA 全称 Java Persistence API ,也就是 Java 持久化 API。

什么是持久化(Persistence)?

持久化是把存在于内存中临时易变的(Transient)的数据保存到可永久保存的存储设备中,这个存储设备可以是硬盘,也可以是数据库等。

JPA 通过 XML 或 JDK 5.0 注解描述对象-关系表的映射关系(ORM),通过相应接口将数据持久化到数据库中。

什么是 ORM(Object - Relational Mapping)?

ORM 翻译成中文叫做对象关系映射,实现 Java 对象模型到关系数据模型的持久化。
面向对象编程是企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。
ORM 主要解决对象模型与关系数据模型之间的阻抗

对象模型与关系数据模型

一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。

什么是持久化类?

持久化类通常是一个 POJO(Plain Ordinary Java Object),也就是不含业务逻辑的简单 Java 对象,与之相对应的是EJB(Enterprise JavaBean),也就是企业级 JavaBean,实际上 EJB 又被分为会话 Bean(Session Bean),实体 Bean(Entity Bean)和消息驱动 Bean(MessageDriven Bean)。EJB 里面有很多为了实现分布式系统的方法,它是一个重型 JavaBean,是侵入式的。而 POJO 里面只包含属性(Field),构造方法,属性对应的 setter/getter 方法及其他一些必要的方法(Method),它是一个轻量的 JavaBean,是非侵入式的。
注意: EJB 是一个失败的模型,已经被遗弃。

对象模型关系数据模型
实例记录(行)
属性字段(列)

复杂的情况是当多个 Java 对象,且相互之间存在关联关系,聚集关系(强关联关系)及继承关系。这样的关系又可以细分成一对一、一对多及多对多,同时关系具有方向。

一对一及一对多可以通过加入主键(Primary Key)及外键(Foreign Key)的方式来解决对象模型与关系模型之间的不匹配,多对多关系主要通过联接表的方式解决。

主键

主键可分为业务主键和代理主键,业务主键是取类的某个属性作为主键,代理主键没有任何含义,代理主键可以适应不断变化的业务需求,通常为整数类型。某些情况下需要将类的几个属性组合起来成为一个主键,这被称为联合主键。

JPA 与 Java 版本关联

大多数开发者的服务器环境都是 Apache tomcat,tomcat 允许用户自己指定运行框架,很多应用都是基于 SpringMVC 及 JPA 规范,这里会涉及到一个版本匹配问题。

JavaJPA
Java2.0-Java6.0JPA2.0
Java7.0-Java8.0JPA2.1

注意: Java6.0 之前不支持 JPA2.1,JPA2.1 加入了对存储过程调用的支持。

什么是存储过程?

存储于数据库中一组为了完成特定功能的 SQL 语句集,只需一次编译然后可以反复调用,用户只需通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
注意:存储过程显著提升数据库的效率。

JPA配置

JPA 有两套配置方案,一种采用注解(Annotation),另一种是配置文件(.hbm.xml),之所以有这两种方式存在,Apress.Pro.JPA.2.2nd.Edition.Oct.2013 该书介绍是由于在设计的时候,内部存在两派,一派主张注解,一派主张配置文件,后来争论不休,干脆两种方式都出现在了规范中。

注意:两种方式没有优劣之分。通常,有例外的情况才需要配置 JPA 。

TIPS:所有注解都在包 java.persistence 下,配置文件为 persistence.xml 。

事务与隔离级别

事务

ACID,数据库事务正确执行的四个基本要素的缩写。

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。事务是一个整体,一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

隔离级别

数据库事务的隔离级别有 4 个,由低到高依次为 Read-Uncommitted、Read-Committed、Repeatable_Read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

-脏读不可重复读幻影读
Read-Uncommitted
Read-Committed×
Repeatable-Read××
Serializable×××

×:不会出现,√:可能出现

Read-Uncommitted 和 Read-Committed相当于乐观锁,Repeatable-Read 相当于悲观锁,数据库事务只针对并发情况,Serializable 串行化是串行情况不在讨论范围。

注意:主要使用乐观锁,悲观锁极少使用。只要是并发一定涉及到资源竞争,并发锁的结果不确定。

实体类设计规则

应用极限编程的理论,应当把程序尽可能简单化。计算机中难的是把困难的问题变得简单。

  • 持久性(Persistability)
  • 唯一性(Identity)
  • 事务性(Transactionality)
  • 粒度(Granularity)

粒度

粒度指对象的大小,采用DDD(Domain Driver Design)的设计模式可以得到一个尽可能合理的对象。

注意:计算机中最重要的是数据而不是应用。

数据库要点

延迟加载(Lazy Fecth)不用于简单对象,一般只用于大对象如CLOB(长文本)、BLOB(图像@Lob)。

对象之间的关系

对象大体有 3 类关系,关联关系,聚集关系(强关联关系),继承关系。

对象模型与关系数据模型之间表示关系的方式不同,在关系数据库系统中,必须维护关系完整性,主要是实体完整性和参照完整性。

注意:维护关系时程序员的职责,不要假设 JPA 会为你做这些事情。

JPA 高级映射函数

JPA 高阶查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值