使用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以上的版本。

results matching ""

    No results matching ""