前几篇文章详细讨论了对象模型到关系模型的转化方法,对映射关系做了详细的了解,Hibernate将对象模型转化为相应的关系模型是通过使用相应的映射来完成的(同样也可以使用注解),对于对象之间的关系的转化则是通过使用相应的标签来实现的,对象模型的关系多样性,决定了关系模型的多样性,本文将会对关系映射做总结,使用关系导图来记忆这些标签的使用方法。
一、映射大杂烩
Hibernate通过使用不同的标签实现了对象模型向关系模型的转化过程,但是Hibernate提供了多种映射标签,各种标签通过绘制导图,汇总如下图:
从对象的角度出发可以把映射分为两种一种是关联关系的映射,另外一种是继承关系的映射,其中的组合映射其实是关联关系的一种特殊情况。因为对象之间有多重性关系,所以对象的关系继续划分的话又会有多对多、一对多、多对一、一对一的关系出现,在对象模型中称为多重性,通过使用相应的标签来实现相应的模型的转化。另外这种多重性的关系是相互的所以又可以更加细致的划分为单向性和多向性,单向的关联关系只需要在维护关系的一端添加相对应的标签,双向的映射则需要在对象的两端同时添加对应的标签,因为它是两端同时维护关系的。最后还有一种特殊的组合映射,在对象模型中经常出现,是最强的关联关系,它的映射相对简单。
从关系表的角度出发可以把映射分为集合映射和复合主键映射,集合映射在开发中不经常使用,因为可以通过多重性映射来替代集合映射,可以多了解这种映射即可。对于复合主键映射在设计数据库时不提倡使用,设计数据库时讲求主键唯一,并且选择列集合最少的候选键作为主键,但是一定要了解。
二、映射标签
上文对映射做了详细的划分,通过划分来理清映射之间的关系,便于掌握使用,这里详细来讨论不同的映射所使用的标签实现方法。
2.1 对象模型
关联映射经常用到,对关联关系做划分的话就会出现不同的映射关系,按照关系的多重性划分了不同的映射集合,具体映射的标签如下:
多对多:<many-to-many>
一对多:<one-to-many>
多对一:<many-to-one>
一对一:<one-to-one>
Note:通过使用多重性的映射标签,可以实现对象模型到关系模型的转化。单向的关联只需要在维护关系的一端添加对应的标签,双向关联需要在对象的两端同时添加对应的标签。
组合映射<component>,通过使用该标签将一个对象添加到另一个对象中,生成相应的表结构也会将两个对象合成为一张表,映射简单易懂。
继承映射<subclass>,继承映射也只会生成一张表,在该表中添加相应的类型标签来指明不同的对象的类型,所以需要添加鉴别器<discriminator>标签,并在映射文件中需要添加子类的属性标签。
2.2 关系表
这里分为两种一种是集合映射,同时使用Hibernate提供的集合标签来实现映射关系的转换,另外还需要注意集合的不同类型,根据类型来添加不同的子标签。
Set:<set>;Array:<array>;
Map:<map>,键值成对,需要添加<map-key>子标签;
List:<list>,对象数据是有序的,需要添加<list-index>/<index>;
所有的集合映射:<key>标签指明关系表的主键,<element>指明关系表的属性。
另外还有一种复合主键映射<composite-id>,指明复合主键的关系,在对象模型中需要将主键对象单独转化为一个类,并且该类要实现序列化接口,同时使用该标签将该对象注册到主对象中。
结语
本文是映射的总结性文章,对关系模型和对象模型之间的转化过程做了总结性的讨论,目的是对映射进行分类减轻使用负担,在开发中可以很快的理解该使用何种类型的映射,其实相当的简单,但是需要动手去实践,通过实践来加深对映射的理解,并达到灵活运用的目的。