对象和对象之间除了继承关系之外,还存在着关联关系:包括一对一、一对多 、多对一和多对多关系,在 OpenJPA 框架下,开发者只需要使用 javax.persistence.OneToOne 这样的注释,并提供相应的配置内容,就可以轻松 的实现实体之间的关联关系,并且能够实现实体的级联创建、更新和删除。
本文中我们将以实体之间的一对一关联关系为例,深入地讲述如何使用 OpenJPA 框架提供的注释,实现企业应用中实体之间的关联关系。文中将提供一 个简单的例子,详细的说明如何定义类和类之间的一对一关联关系的步骤,同时 会重点讲述这些注释所支持的属性。一对多、多对一和多对多这三种关联关系在 OpenJPA 中的实现过程和一对一关联关系的实现过程是一致的,只是需要选择使 用不同的注释,在本文的最后,会对实现这三种关联关系进行简单说明,读者可 以参考一对一关系的实现过程来实现一对多、多对一和多对多的关联关系。
一对一关系
在面向对象的世界里,类 A 和类 B 之间形成一对一关系必须满足如下条件:
对象 A1 引用了对象 B1;
类 A 的其它对象 An 不能引用同样的对象 B1。
在关系数据库中,我们通常使用唯一外键的方式来实现一对一关系,下面这个 图说明了这种的情况。
图 1. 关系数据库中的一对一关系
下面开始介绍 OpenJPA 中实现实体之间一对一关联关系的相关知识,为了说 明的需要,我们首先定义一个简单的应用场景。
模拟场景
假定开发者要完成一个图书馆管理系统,我们需要记录书的基本信息如编号、 书名、出版日期等基本信息,还需要记录书的前言,序等信息。
为了说明实体之间的一对一关系,我们将书设计成一个类(Book),包括书的 编号和名称两个属性,同时将书的前言设计成另外一个类(BookExtend),它包 括书的编号和前言两个属性。由于一本书有前言而且也不可能有其它书的前言部 分会和它一样,所以类 Book 和 BookExtend 之间很自然的形成了一对一的关系 。这两个类的属性以及类之间的关系如下图所示。
图 2. 类之间的一对一关系
[注]:为了说明的简单,本例子设计时每个对象只选择了必要的属性。