Pro JPA2 第一章(简介)
目前世界上的企业数据,绝大多数存储在关系数据库中.
理解关系数据是企业开发成功的关键.
Java成功的很大一部分应该归功于,其被广泛的用于构建企业数据库系统.
但是,在数据库系统和Java应用程序的对象模型之间来回地移动数据,比实际所需困难的多.Java开发人员或者需要编写大量的代码,将行和列数据转换成对象,或者发现自己被绑定到某些专用的架构中,这些架构试图对他们隐藏数据库.
幸运的是,我们Java有了JPA,以构建面向对象的域模型和关系数据库系统之间的桥梁.
JPA的优势之一是,可以将它插入到应用程序所需的任何层,级,或者架构中.
1.1 对象-关系映射
用于在对象模型和关系模型之间搭建桥梁的技术,称为对象-关系映射(object-relational mapping),通常表示为O-R映射或者简写为ORM.该术语来源于这样的思想:我们正在以某种方式将一个模型的概念映射到另一个模型,目标是引入一个中介来管理一个模型到另一个模型的自动转换.
在此之前,先定义一下什么是理想的解决方案.- 对象,而不是表.应用程序应该依据域模型进行开发,而无需绑定到关系模型.必须能够在域模型上操作和查询,无须表示成关系语言的表,列以及外键.
- 方便,但非无知.ORM适用于那些已经理解了映射问题,并且知道他们所需的开发人员,这些开发人员不想编写成千上万行代码来处理已经解决的问题.
- 不显著,但非透明.期望持久化是透明的是不合理的,因为应用程序总是需要控制它正在持久化的对象,并且关注实体的生命周期.然后,持久化解决方案不应当干扰域模型,不必要求扩展类或者实现接口是可持久化的.
- 旧数据,新对象.与创建一个新的数据库架构相比,应用程序更加可能链接到已经存在的关系数据库架构中.
- 充分,但不过分.功能足够就好,但不能因为功能太强而引入太多的系统开销.
- 本地,但可移动.包含持久化状态的实体必须能够移动到任何需要它们的层.
阻抗失谐
对象-关系映射的倡议者通常把对象模型和关系模型之间的差异描述为两者之间的阻抗失谐(impedance mismatch).
将一个模型映射到另一个模型的挑战不在于两者之间的相似性,而在于每个模型中存在一些概念,这些概念在另外一个模型中没有任何逻辑等价物.- 从类的表示来看.有些敏感信息或者明显可以单独建表的信息,在数据库架构设计中,不一定是在同一张表中.这种情况也发生在一张表的某一个字段当中.例如,一个人的出生年月,是用一个birthday字段来表示,还是用三个字段年,月,日来表示.
- 从关系的角度来看.表与表,实体与实体之间的关系有一对一,一对多,多对多,多对一等各种复杂的关系,而且关联实体或者关联表中又会有其他关联.我们在代码开发的过程中,必须面对这种情况,而且还要面对主键不在对象 模型中,以及在模型中必须引入额外关系甚至关联类以补偿数据库架构的可能性.
- 从继承的角度看,对象-关系映射不再只是处理从一个类到一个表有一个自然映射的情况.在抽象出超类或者父类的时候,引入了将简单问题复杂化的可能性.
- 1.2 Java持久化支持.(略)
- 1.2.1 专用解决方案.Oracle TopLink等
- 1.2.2 JDBC
- 1.2.3 企业Bean(EJB)
- 1.2.4 Java数据对象(JDO)
- 1.3 为什么需要另一种标准.(略)
- 1.4 Java持久化API
Java持久化API(Java Persistence API) 是轻量级的,基于POJO的用于Java持久化的架构.
- 1.4.1 规范的历史
- EJB3.0和JPA1.0.(略)
- JPA 2.0.(略)
- JPA和您.(略)
- 1.4.2 概述
- POJO持久化
使用POJO进行对象的持久化意味着任何持久化的对象都没有什么特殊之处.
使用JPA的对象-关系映射完全是元数据驱动的.可以通过把注解添加到代码中,或者使用外部定义的XML来实现它. - 非干扰性
持久化API作为一个与持久化对象独立的层存在.持久化API有应用程序业务逻辑所调用,并传递持久化对象以及相应的操作指示.因为API不干扰在持久化对象类中的代码,所以我们称之为非干扰式的持久化(non-intrusive persistence). - 对象查询
一个强大的查询架构提供了能够跨越实体和关系的查询能力,而不必使用具体的外键或者数据库列.
查询跨越表示为Java持久化查询语言(JP QL)也可以表示为一个机遇实体模型的架构抽象. - 移动实体
离开持久化层的对象称为是分离的.持久化模型的一个关键功能是鞥能够改变分离的实体,然后在它们返回时重新连接到虚拟机.该分离模型提供了一个方法,使得可以协调实体重新连接时的状态与它编程分离之前的状态.从而,荀彧离线改变实体,同时在面临并发时仍然保持实体的一致性. - 简单配置.
所有功能都可以通过使用注解,xml,或者两者结合的组合来配置.
相比元数据语言,更大的意义在于JPA使用大量默认值的事实.这意味着无论选择何种方法,都要求用于保证运行的元数据的数量绝对是最少的.如果默认已足够满足要求,那么几乎根本不需要任何元数据. - 集成性和可测试性.
利用Java持久化API,现在可以编写服务器集成的九成九代码,并能够重用它以在服务器外部进行测试.
- POJO持久化
- 1.4.1 规范的历史