第13章 复杂映射关系null第13章 复杂映射关系第13章 复杂映射关系本章将介绍几种复杂的映射关系:关联关系映射、集合类的映射、组件映射和继承关系映射。与前一章基础映射都是针对单个类不同,这些映射都是涉及两个或者两个以上的类,除了映射类本身与数据库表之间的关系外,还要在映射文件中表达类与类之间的关系。 源码网:www.codepub.com13.1 关联关系映射13.1 关联关系映射Hibernate中的关联(Association)映射主要有3种:一对一关联、一对多(或多对一)关联、多对多关联。每种关联都可以分为单向和双向两种。关...
null第13章 复杂映射关系第13章 复杂映射关系本章将介绍几种复杂的映射关系:关联关系映射、集合类的映射、组件映射和继承关系映射。与前一章基础映射都是针对单个类不同,这些映射都是涉及两个或者两个以上的类,除了映射类本身与数据库
之间的关系外,还要在映射文件中表达类与类之间的关系。 源码网:www.codepub.com13.1 关联关系映射13.1 关联关系映射Hibernate中的关联(Association)映射主要有3种:一对一关联、一对多(或多对一)关联、多对多关联。每种关联都可以分为单向和双向两种。关联关系映射通常情况是最难配置正确的。在这个部分中,本节将从单向关系映射开始,然后考虑双向关系映射,最后介绍一个完整的实例。13.1.1 多对一(many to one)13.1.1 多对一(many to one)单向many-to-one关联是最常见的单向关联关系。如图所示,类与类之间是多对一的关系。13.1.2 一对一(one to one)13.1.2 一对一(one to one)一对一的关联分为外键关联和主键关联。
(1)外键关联:基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。
(2)主键关联:基于主键关联的单向一对一关联通常使用一个特定的id生成器。这里的关联关系是定义在Address类的映射文件中,在辅表的one-to-one的属性里要加constrained="true"表示受到约束。13.1.3 一对多(one to many)13.1.3 一对多(one to many)基于外键关联的单向一对多关联是一种很少见的情况,并不推荐使用。此时的Person包含一个addresses字段,这个字段是一个Address类的集合。
public class Person {
//一对多实现,包含一个集合类属性
private Set addresses= new HashSet();
public Set getAddresses () {
return addresses;
}
public void setAddresses (Set addresses) {
this. addresses= addresses;
}
}13.1.4 双向关联(Bidirectional associations)13.1.4 双向关联(Bidirectional associations)以上介绍的都是把关联关系定义在两个类中的一个类,也就是主控类中。只有对主控类操作的时候,才会涉及到关联关系,这样还不足以严格表达明确的关联关系。很多时候还需要表达双向的关联关系,也就是在两端的映射中都定义关联关系。
inverse映射属性究竟表示什么呢?一个双向关联仅仅是在两端简单地正确设置引用。然而,Hibernate并没有足够的信息去正确地执行INSERT和UPDATE语句(以避免违反数据库约束),所以它需要一些帮助来正确的处理双向关联。把关联的一端设置为inverse将告诉Hibernate忽略关联的这一端,把这端看成是另外一端的一个镜象(mirror)。这就是所需的全部信息,Hibernate利用这些信息来处理把一个有向导航模型转移到数据库schema时的所有问题。13.1.5 双向一对一13.1.5 双向一对一双向一对一与单向类似也是分为两种。
(1)基于外键关联的双向一对一关联也很常见。
(2)基于主键关联的一对一关联需要使用特定的id生成器。13.1.6 使用连接表(with join tables)13.1.6 使用连接表(with join tables)如果想保持关联两个表的独立性,也就是不想在Person表中出现类似addressId这样不容易理解的字段,就需要使用连接表。专门定义一张表来维护Person与Address之间的关系。关联表结构如图所示。13.1.7 多对多(many to many)13.1.7 多对多(many to many)对于多对多关联或叫n:m实体关系(类图如图13.3所示),需要一个关联表(association table)。表里面的每一行代表从person到address的一个关联。表名是由set元素的table属性配置的。关联里面的标识符字段名,对于person的一端,是由
元素定义,而address一端的字段名是由元素的column属性定义。也必须告诉Hibernate集合中对象的类(也就是位于这个集合所代表的关联另外一端的类)。
(1)单向多对多关联。
(2)双向多对多关联13.1.8 完整实例13.1.8 完整实例本节将展示一个完整的一对多/多对一双向的实例。
(1)持久化类。为了与之前的示例区分,这里使用时User类和Room类,
(2)映射文件。
(3)测试代码如代码所示,给room增加两个user后直接保存room对象。
(4)运行结果。
(5)指定inverse。13.2 集合类(Collections)映射13.2 集合类(Collections)映射Java提供了丰富的集合类库,它们可分为3类:
Set:集合中的对象不按特定方式排序,而且没有重复对象。(有些Set也提供了排序功能如TresSet,不过这并不是Set接口的特性)
List:集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。
Map:集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。(有些Map也提供了排序的能力如TreeMap)
Hibernate允许把以上3种Java集合都映射到数据库中。在映射文件中,与映射java结合相关的元素包括、、和
本文档为【第13章 复杂映射关系】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。