原创 | 使用 JPA 全面实现 DDD 持久化【关于本书】
对于任何规模的企业应用来说,数据持久化都是其中必不可少的一个关键组成部分。因为持久化是如此重要,而关系数据库是事实上的数据存储标准,所以 Java 的所有者 Sun Microsystems 早早就为数据库访问制订了规范,这就是 JDBC(Java Database Connectivity)。
JDBC 的本意是为不同种类的关系数据库制定统一的 API,这样一来,Java 开发者就不再需要针对不同类型的关系数据库分别编写一套不同的访问代码。但是在 JDBC 的使用上,还是存在下面的严重问题无法解决:
使用 JDBC 规范编写的数据访问代码非常冗长,每个连接、语句、结果集都要记得手工关闭,而连接、语句、结果集的创建、操作和关闭都会抛出受检的(checked)异常,稍不小心就会导致内存泄露或者连接耗尽。据统计,绝大部分的开发者都不能编写正确的、完善的 JDBC 数据库访问代码,包括很多大牛都会犯错误。你能想象语句的关闭也会抛出异常,需要再次捕获并且在
finally
语句里面处理吗?
JDBC 虽然在 API 层面作出了统一,但是在 SQL 语句的层面上却不能统一。针对 Oracle 编写的 JDBC 访问代码不能直接移植到 MySQL 上,因为它们各自支持不同的方言。因此,JDBC 不能保证数据库可移植性。
Java 是一种面向对象的编程语言。在企业应用中,需要持久化到数据库的是领域层的领域对象(实体和值对象)。领域对象之间有四种关系:关联、泛化(继承)、聚合和组合。而数据库核心对象是二维数据表,表与表之间只有一种关联关系。在对象模型和关系模型之间存在阻抗失配。要将实体对象持久化到关系数据库中,需要编写大量的转换代码。
对 Java 持久化进行标准化的第二次尝试是 EJB 规范中的实体 Bean。实体 Bean 是可以存储在持久存储介质上的持久对象,常用来表示持久性数据并提供操作这些数据的方法。但是实体 Bean 非常难用,又只能在 JavaEE 的环境下使用,这意味着必须使用笨重的应用服务器例如 WebLogic 和 WebSphere,而且不能在 EJB 容器外进行轻量级的单元测试。
由于官方规范的落后,Java 社区中的一些程序员决定先行一步,探索更好的方式实现数据持久化。2002 年 Martin Fowler 出版了《Patterns of Enterprise Application Architecture》一书,针对数据持久化提出了数据映射器模式,建议通过数据映射器将领域模型映射到关系模型。2001 年,澳大利亚程序员 Gavin King 厌倦了实体 Bean,就上街买了一本 SQL 编程的书(他当时还不懂 SQL),决心开发一个符合对象关系映射理论的好用的 Java 持久化框架。当年 11 月,ORM 软件 Hibernate 横空出世。此后几年时间,Hibernate 和 Spring 两大框架联手,将 EJB 规范以及支持它的应用服务器扫入了历史垃圾堆,从此,J2EE Development without EJB
成了现实。
后来 Java 的管理组织 JCP 以 Hibernate 为参考推出了 Java Persistence API(简称 JPA),正式将对象关系映射这种数据持久化的形式标准化、规范化,成为 Java 持久化的一个标准。曾经有一个与 JPA 并驾齐驱的持久化规范:Java Data Objects(简称 JDO),但目前已经式微。
JPA(在 Hibernate/EclipseLink 这类 JPA 实现框架的支持下)已经大大简化了持久化的工作。Spring Data JPA 的出现,进一步简化了数据查询的工作。使用了 Spring Data JPA 之后,大多数情况下你无需编写一行查询代码,只需要根据实体属性定义进行查询、分页和排序的接口方法,其余的交给 Spring 在运行时实现就可以了。
| 本书主要涉及:
使用 JPA 编写 ORM。只使用 JPA 的注解、接口和类来编写 ORM 代码,不使用 Hibernate 提供的任何扩展。
使用 Hibernate 运行时支持。Hibernate 作为 JPA 的实现,只在幕后默默支持 ORM。任何代码都不直接使用和依赖 Hibernate。
使用 Spring Data JPA 查询。通过 Spring Data JPA,以一种更加简化的方式实现数据查询。
本书基于 JPA 2.2,Hibernate 5.4 和 Spring Data JPA 2.3 进行介绍。需要用到 Java 8 以上的版本。
以下是本书的目录,敬请持续关注课程的更新。
版权声明: 本文为 InfoQ 作者【编程道与术】的原创文章。
原文链接:【http://xie.infoq.cn/article/88f1c6c23f91d91124f68912a】。文章转载请联系作者。
评论 (1 条评论)