使用 Apache OpenJPA 开发 EJB 3.0 应用,第 3 部分: 实体继承
2010-04-19 00:00:00 来源:WEB开发网核心提示:面向对象和关系型数据库Java 语言天生就是一门面向对象的编程语言,在 Java 世界中,使用 Apache OpenJPA 开发 EJB 3.0 应用,第 3 部分: 实体继承,被处理的内容都被组织成一个一个的对象,对象和对象之间存在着继承、引用关系,假设分别对应 Animal 表、Fish 表和 Dog 表,如果要
面向对象和关系型数据库
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
更多精彩
赞助商链接