编程生活

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  113 随笔 :: 0 文章 :: 18 评论 :: 0 Trackbacks

OpenJPA 是最新的尝试,它能够将对象继承关系的持久化透明化,企业应用开发者仅需要处理对象模型,而不需要处理和关系型数据库有关的内容,极大地降低了对象继承关系持久化的难度。下面我们来了解 OpenJPA 中持久化对象继承关系的几种方式。

持久化对象继承关系的方式

我们从关系数据库角度看对象继承关系的持久化这个问题域:对象继承通常意味着子类比父类提供更多的属性,持久化对象继承关系的实质就是如何根据对象的类型动态的处理这些多出来的属性。OpenJPA 框架支持使用三种不同的策略处理对象继承关系:

1. 类及其子类保存在一张数据库表中

在这种情况下,类及其子类都保存在同一张数据表中,该表提供足够的字段保存类及其子类的所有属性,同时提供一个特别字段保存当前记录对应类的实际类名(默认名 DTYPE,也可以在开发时指定其它名称)。在企业应用运行过程中,OpenJPA 框架根据 Java 对象的实际类型和数据库表进行绑定。
图 1. Animal、Fish 和 Dog 对象模型
图 1. Animal、Fish 和 Dog 对象模型
以上图中提到的对象模型为例: Animal、Fish、Dog 三个类的所有对象实例都被保存在 Animal 数据表中,该表将会有 5 个属性,其中 ID,NAME 字段对应 ANIMAL 类的两个属性,ID、NAME、SEX 对应 Dog 类的属性,ID、NAME、STERRITORY 对应 Fish 类的属性。DTYPE 是 OpenJPA 加入的字段,用于确定当前记录的实际类类型,在这里例子中,它的内容是“ANIMAL”、“FISH”或者是“DOG”。


图 2. 第一种策略的数据库表现
图 2. 第一种策略的数据库表现

2. 类和子类分别保存在不同的数据库表中,互相之间没有关联

这种情况下,开发者不理会类之间是否存在继承关系,为每一个类的持久化使用唯一的表,父类对象保存在父类对应的表中,子类对象的信息保存在子类对应的表中,这也是通常的持久化框架采用的方式。下面这个图显示了这种情况下对象继承关系数据库中的表现。

以上一章节中提到的对象模型为例: Animal、Fish、Dog 三个类的对象实例都被保存在各自对应的数据表中。下面这个图显示了这种情况下对象继承关系数据库中的表现。


图 3. 第二种策略的数据库表现
图 3. 第二种策略的数据库表现

3. 类和子类分别保存在不同的数据库表中,子类中不保存父类中已有的属性,仅通过主键进行关联

这种情况下,父类和子类对应不同的表,但是子类对应的表中不再保存父类对应表中已经存在的字段信息,两个表之间通过关键字段关联起来,也就是数据库技术中通常所说的外健。这种实现方式是最理想化的一种,既能够处理对象之间的继承,又满足了关系数据库中对于设计范式的要求。

以上一章节中提到的对象模型为例: Animal、Fish、Dog 三个类的对象实例都被在 Animal 表中有记录;而 Fish 对象的 TERRITORY 属性者被 FISH 表所保存,FISH 表通过 ID 和 Animal 表中的数据进行关联;而 Dog 对象的 SEX 属性者被 Dog 表所保存,Dog 表通过 ID 和 Animal 表中的数据进行关联。下面这个图显示了这种情况下对象继承关系数据库中的表现。


图 4. 第三种策略的数据库表现
图 4. 第三种策略的数据库表现

这三种方式的处理对于开发者而言是透明的,无论选择哪一种,仅仅影响数据在关系数据库中的保存方式,对于开发者而言,只需要按照面向对象的方式操作对象既可,OpenJPA 框架在处理持久化操作的时候,会动态地判断当前对象的实际类类型(后期绑定),从而确定持久化到哪个表中。在一个企业应用的实现中,开发者可以根据需要选择这三种方式的一种或者几种来处理对象之间的继承关系。

Inheritance 注释

OpenJPA 是一个基于注释的持久化框架,对持久化的大多数元信息都只需要为实体类提供相应的注释。开发者使用注释描述实体和数据库表之间的映射,也采用注释描述对象继承关系的持久化。javax.persistence.Inheritance 注释用来指定对象继承关系持久化的方式。它的 strategy 属性用于指定持久化对象继承关系在关系数据库中的表现形式,可选择项包括 SINGLE_TABLE、JOINED 和 TABLE_PER_CLASS。它们三个都是 javax.persistence.InheritanceType 中定义的常量。

  • SINGLE_TABLE

    strategy 设置为 SINGLE_TABLE 选项表示所有类及其子类保存在同一个数据库表中,对象的类型使用表中的特殊字段 DTYPE 进行识别。

  • TABLE_PER_CLASS

    strategy 设置为该选项表示每个类使用一个表。

  • JOINED

    strategy 设置为该选项表示父类和子类分别保存在不同的数据库表中,子类中不保存父类对应数据库表中已有的属性,仅通过主键进行关联。

javax.persistence.Inheritance 注释是类级别的注释。需要为每一个成为父类的实体类提供 javax.persistence.Inheritance 注释并且指定 strategy 属性。在同一个企业应用中,开发者可以根据实际情况选择这三种策略中的一种,或者是几种同时使用。

posted on 2007-10-26 12:28 wilesun 阅读(518) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: