第三章Hibernate对象关系映射
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
它指的是当主控方执行操作时,关联对象(被动方) 是否同步执行同一操作。
如对主控对象调用save-update或delete方法时,是否同时对 关联对象被动方)进行save-update或delete。这里,当客户 (Customer)被更新或者删除时,其所关联的订单( Order)同时被修改或者删除,因此,这里的级联关系设 置为all。
关联关系的类型
多对多关联
Hibernate关联关系中相对比较特殊的就是多对多关联 ,多对多关联与一对一关联和一对多关联不同,多对 多关联需要另外一张映射表用于保存多对多映射信息 由于多对多关联的性能不佳(由于引入了中间表,一 次读取操作需要反复数次查询),因此在设计中应该 避免大量使用。同时,在对多对关系中,应根据情况 ,采取延迟加载机制来避免无谓的性能开销。
all:所有情况下均进行级联操作; none:所有情况下均不进行级联操作; save-update:在执行save-update时进行级联操作。 delete:在执行delete时进行级联操作。
作用:
它指的是当主控方执行操作时,关联对象(被动方)是否 同步执行同一操作。
多对一双向关联CRUD
Hibernate 第三章 Hibernate对象关系映射
主讲 : 卢健良
本章内容
对象关系映射
多对一单向关联(重点) 一对多单向关联(重点) 多对一双向关联(重点) 一对一单向关联 一对一双向关联
什么是关联关系
什么是关联关系
关联关系表示不同类的对象之间的结构关系,它在一 段时间内将多个类的实例连接在一起
一对一外键双向关联
以外键关联的一对一,其实本质上变成了一对多的 双向关联,编写时直接按照一对多和多对一的要求 编写,最后在many-to-one这一边加上一个 unique=“true”,说明它是一对多的特例。 one-to-one 节点有以下属性:
cascade :操作级联(cascade)关系 constrained: 约束表明主控表的主键上是否存在一个 外键(foreign key)对其进行约束。这个选项关系到 save、delete等方法的级联操作顺序。默认为关联类的 主键属性名。
一对一外键单向关系映射
在关系方,勿需做任何映射
一对一外键双向关系映射
在一对一的外键双向关联中,关系的双方都需要进行关联
一对一外键双向关系映射
同样在映射文件中也需要双方进行映射
外键所在方(主控方),映射不变
一对一外键双向关系映射
另外一方,需要添加如下映射信息
<one-to-one name="customer" />
inverse属性
<set>节点具有此属性 可选值:
true false
指定谁是关联关系的维护者即主控方,如果指定 inverse=“false”当前类为主控方,那么所有关系由当前 类进行维护,如果指定inverse=“true”,那么说明当前 类为被控方,所有关系由主控方进行维护
dept No Name loc
多对一单向关联 no
emp name sal Comm dept
emp dept No Name loc no name sal Comm deptno
多对一单向关联关系
以学生与班级为例
一个班级拥有多个学生 一个学生只属于某个特定的班级 那么学生和班级之间为一对多的关系
进行关联操作的好处
在Hibernate中关联关系表现在所映射的表与表之间的 关系,采用关联操作,能够使有关系的表之间保持数 据的同步 关联操作能够使程序员在编写程序过程中,减少对多 表操作代码的编写,并且优化了程序,提高了程序运 行的效率。
关联关系的类型
在Hibernate中关联关系的类型
级联
级联(cascade)在Hibernate映射关系中是个非常重要 的概念。
可选值有
all:所有情况下均进行级联操作; none:所有情况下均不进行级联操作; save-update:在执行save-update时进行级联操作。 delete:在执行delete时进行级联操作。
一对一关联
假设有两个实体,分别是客户对象(Customer)和客户身份 对象(Certificate),它们之间就是一对一的关系。一个客户 只能有一个身份,一个身份也只能对应一个客户。该一对 一关联可以分为两种,分别是以主键关联和以外键关联。
一对多关联/多对一关联
一对多和多对一关联分为单向关联和双向关联,在此,着 重介绍双向关联。假设有两个实体,学生对象(Student) 和班级对象(Clazz),一个班级可以有多个学生,表现 为一对多的关系,一个学生只能属于某个特定的班级,表 现为多对一的关系 。
那么在进行关系映射时,可以在多方进行映射
多对一单向关系映射
多对一的单向关系映射,需要在多端的映射文件中添加如 下内容:
<many-to-one name="cls" column="cls_id“/>
其中name指定属性名 其中column映射数据库中所对应的外键列
多对一单向关系映射
一对多单向关联关系中,需要在一端的映射文件中加入如 下内容:
一对多单向关系
<set>元素包括以下属性:
name:设定待映射的持久化类的属性名,这里为Clazz类 的students属性; lazy: 是否采用延迟加载。 inverse: 用于标识双向关联中的被动方一端, inverse=false的一方(主控方)负责维护关联关系,默 认值 为false。 cascade 操作级联(cascade)关系,可选值为all : 所有 情况下均进行级联操作;none:所有情况下均不进行 级联操作;save-update:在执行save-update时进行级联 操作.
总结
关系映射 一对一关系映射
外键所在方:<many-to-one unique=“true”> <one-to-one>
多对一关系映射
多方:<many-to-one> 一方:<set >
<key></key> <one-to-many> </set>
在多对一单向关系映射中,一端无需进行映射
Major Id Mname Set<Clazz>
一对多单向关联 Id
Clazz cname
clazz major Id mname Id Cname mid
一对多单向关联
以上为在多端进行关联的关系映射方式,下面说明在一端 进行单向关联的映射方法
Fra Baidu bibliotek
一对多单向关联
一对多单向关联
<set>元素还包含两个子元素:
<key>
<key>元素设定与所关联的持久化类对应的表的外键,此 处为student表的cls_id
<one-to-many>
<one-to-many>元素设定所关联的持久化类,此处为 Student类。
一对多双向关联
一对多(多对一)双向关联是多对一单向关联和一对多单向 关联的综合,在关系的双方都进行关联
一对多双向关联
Student Id name Clazz cls
一对多单向关联 Id
Clazz Cname Set<Student> students
clazz Students Id Name cid Id Cname
多对一双向关联CRUD
cascade属性
<set>节点、<many-to-one>节点以及<one-to-one>节点 拥有此属性 属性值有:
CardId Id no begin End pid
一对一外键单向关系映射
那么在一对一单向关系中,在关系的主控方即Customer的 映射文件中,需要对关系进行映射:
一对一单向关系映射和多对一单向关系映射十分类似,需要 在Custom.hbm.xml中作如下映射: <many-to-one name="account" column="account_id" unique="true" /> 其中name指定属性名 Column指定外键 Unique指定当前关系为一对一
一对一外键单向关系映射
以客户和客户账户信息为例
一个客户拥有一个唯一的账户信息 一个账户信息只能属于某个特定客户 那客户与客户账户信息之间为一对一的关联关系
以下描述一对一单向关系映射
在一对一关系映射中,我们可以将关系映射在关系中任何一 方,如将关系映射在Customer方
person Id Name Sex Birthday cid
关联关系的类型
多对多关系
多对多关联只有双向关联,假如有订单对象(Order) 和产品对象(Product),一个订单可以对应多个产品 ,一个产品同样也可以对应多个订单,订单和产品的 关系就属于多对多关联关系。 为表示它们之间的关系,还需建立一张订单—产品关 系表(Order_Product),这张表里只存储order表和 product表的关联关系,并没有额外的内容。