使用Apache OpenJPA开发EJB 3.0应用,第3部分: 实体继承2011-08-31 IBM 肖菁面向对象和关系型数据库Java 语言天生就是一门面向对象的编程语言,在 Java 世界中,被处理的内 容都被组织成一个一个的对象,对象和对象之间存在着继承、引用关系,这样的 关系无法通过简单的方式直接映射到关系型数据库中。因此在关系型数据库与面 向对象之间存在着阻抗失谐。我们通过一个简单的例子来说明这种阻抗失谐给企业应用开发者带来的困难。 假设在企业应用中存在三个 Java 类:Animal、Fish 和 Dog。Animal 仅仅具备 两个属性:id 和 name。Fish 是一种 Animal,但是人们比较关注它的生活区域 是在海里还是在河里,因此它除了继承自 Animal 之外,还有自己独特的属性 territory。Dog 也是一种 Animal,人们比较关注它的性别,因此它除了继承自 Animal 之外,还有自己独特的属性 sex。我们可以用下面这个图描述三者之间的 关系模型。图 1. Animal、Fish 和 Dog 对象模型

在 Java 应用中,由于动态绑定的支持,Fish、Dog 都可以被作为 Animal 对 象处理。但是如果我们换到关系型数据库的视角,情况发生了改变: 通常情况下 ,Animal、Fish、Dog 毫无关联,它们都保存在各自对应的表中,假设分别对应 Animal 表、Fish 表和 Dog 表,如果要维护 Animal 和 Fish 的继承关系,我们 就需要使用 SQL 的联合查询语句查出 Animal 的所有属性和 Fish 的所有属性, 这样就必须使用某种外键进行关联:Select animal.*,fish.* form animal,fish where animal.id = fish.id从这个简单的例子中我们就可以看出,一个企业应用开发者使用 Java 实现企 业应用时需要同时掌握面向对象和关系型数据库的两种思想,而且还必须保证它 们之间的映射是正确的,否则无法保证企业应用的正确性,这对于企业应用开发 者是个的挑战,因此 Java 社区一直在寻求如何将面向对象和关系型数据库思想 统一起来的简单途径,这方面的努力促进了持久化技术的发展。OpenJPA 是最新的尝试,它能够将对象继承关系的持久化透明化,企业应用开 发者仅需要处理对象模型,而不需要处理和关系型数据库有关的内容,极大地降 低了对象继承关系持久化的难度。下面我们来了解 OpenJPA 中持久化对象继承关 系的几种方式。