
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明IT培训的老师知道,hibernate中的关联关系有四种:一对一、一对多、多对一、多对多。
关联关系中又分为单向关联与双向关联
单向关联:单向关联是指只有一方有另一方的关联信息而另一方没有关联信息
例:
A——>B
A对象中有B对象的关联信息
B对象中没有A对象的关联信息
我们可以通过A对象中B的关联信息查询或修改B对象的信息但无法通过B对象来查询修改A对象的信息
同理A<——B也是单向关联
这种只是单方面的关联我们称为单向关联
双向关联:双向关联是指两方都有另一方的关联信息
例:
A<——>B
A对象中有B对象的关联信息
B对象中也有A对象的关联信息
我们可以通过A对象中B的关联信息查询或修改B对象的信息也可以通过B对象来查询修改A对象的信息
这种两方都有另一方的关联信息我们称为双向关联
单向关联一般在一方配置多方不进行配置
如:一对多单向关联在“一”的一方配置文件里进行配置,"多"的一方不进行配置
双向关联两方都要配置
如:一对多双向关联在“一”的一方配置文件里需要配置,“多”的一方也需要进行配置
通过下面的代码会慢慢了解
下面我们来详细了解一下一对一、一对多、多对一、多对多的单向和双向关联:
一对一关联映射
一对一关联:一对一是指一个对象对应一个对象 如:一个人只有一个身份证。
在两个数据表之间的一对一关系可以有两种实现方法,其中一种就是通过两个表的主键相关联,另一种是通过外键相关联
如:一个人(Person)对应一个地址(Address)代码如下。
一对一主键单向关联:
Person——>Address
这种单方面有另一个对象的关联信息的时候我们称为单向关联,
单向关联和双向关联的区别主要在于单向只在一方配置而双向两方都要配置
Address.hbm.xml
因为是单方面关联所以只在Person.hbm.xml中配置了关联信息而Address.hbm.xml中不做任何配置
所以我们省略Address.hbm.xml
知道了一对一的单向关联,我们再来了解一下一对一的双向关联,双向关联结合上面的知识可能聪明的小伙伴已经想到了。下面我们来看一下一对一的双向关联
一对一主键双向关联:
Person<——>Address
一对多关联映射
一对多关联:一对多是指一个对象对应多个对象同样也分为单向关联和双向关联如:一个教室可以有多个学生
一对多单向关联:
Classes——>Student
单向关联只需在一方配置hbm.xml文件Student不需要配置所以就省略了
Classes对象中使用了set属性,但是只是说明了延迟加载的属性,并没有为属性配置对应的对象,属性的对象是要在映射文件中来配置的,需要添加set标签,并在set标签中添加<one-to-many>标签,
因为Classes一方是一方对应的Student是多方所以我们要用<set>来关联一方
Student.hbm.xml不做任何改变
一对多双向关联:
Classes<——>Student
Classes.hbm.xml
因为与单向一对多配置一样所以就省略了可以参考上面单向一对多的代码
Student.hbm.xml
双向我们需要两方都要配置代码
Classes.hbm.xml
因为与单向一对多配置一样所以就省略了可以参考上面单向一对多的代码
Student.hbm.xml
双向我们需要两方都要配置代码
多对一关联
对比一对一关联映射和多对一唯一外键关联映射,其实它们两个都是使用了<many-to-one>本质上都是外键约束,只不过一对一的是唯一映射,需要添加unique="true"的属性,其它的它们两个是相同的。
多对一关联:多对一关联是指多个对象对应一个对象如:多个员工对应一个部门
级联操作Cascade:
一.简单的介绍
cascade和inverse (Employee–Department)
l Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:
none,all,save-update,delete, lock,refresh,evict,replicate,persist,
merge,delete-orphan(one-to-many)。
一般对many-to-one,many-to-many不设置级联,
在<one-to-one>和<one-to-many>中设置级联。
l inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;
该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。
one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。
注:配置成one-to-one的对象不维护关联关系
二,属性的解析
class元素的lazy属性设定为true,表示延迟加载,如果lazy设为false,则表示立即加载。以下对这二点进行说明。
立即加载:表示Hibernate在从数据库中取得数据组装好一个对象(如学生1)后,会立即再从数据库取得数据组装此对象所关联的对象(如学生证1)。
延迟加载:表示Hibernate在从数据库中取得数据组装好一个对象(如学生1)后,不会立即再从数据库中取得数据组装此对象所关联的对象(如学生1),而是等到需要时,才会从数据库取得数据组装此关联对象。
<one-to-one>元素的cascade属性表明操作是否从父对象级联到被关联的对象,
它的取得可以是以下几种:
none:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联操作。它是默认值。
save-update:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,游离对象)。
delete:在删除当前对象时,级联删除附属对象。
all:所有情况下均进行级联操作,即包含save-update和delete操作。
delete-orphan:删除和当前对象解除关系的附属对象。
<one-to-one>元素的fetch属性的可选值是join和select,默认是select。当fetch属性设定为join时,表示连接抓取(Join fetching):Hibernate通过在Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合。
当fetch属性设定为select时,表示查询抓取(Select fetching):需要另外发送一条Select语句抓取当前对象的关联实体或集合。
三。代码练习
<set ame="emps" cascade="save-update">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
<set ame="students" table="taacher_student" inverse="true"><!-- table是用来指定中间表的属性-->
<key column="teacher_id"></key><!--查找教师id时,链接中间表表的teacher_id -->
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
关系映射总结:
单向关联
一对一主键关联:单向关联时我们需要在有关联信息一方的配置文件里加入<one-to-one constrained="true">并且将constrained属性设置为true表示的主键必须与这个对象中对应资料的主键相同
一对一外键关联:单向关联时我们需要在有关联信息一方的配置文件里加入<many-to-one unique="true">并且将unique属性设置为true表示这个主键是唯一的
一对多单向关联:单向关联时我们需要在有关联信息一方的配置文件里加入<set>在<set>中加入<one-to-many/>
<set>
<key column="关联的外键">
<one-to-many/>
</set>
多对多单向关联:单向关联时我们需要在有关联信息一方的配置文件里加入<set>在<set中生成一张新表用来存放两个表的外键table="">中加入<key column="当前表的外键ID"><many-to-many clasee="关联对象路径" column="关联对象表的Id">
<set table="">
<key column=""/>
<many-to-many class="" column="">
</set>
多对一单向关联:单向关联时我们需要在有关联信息一方的配置文件里加入<many-to-one>
双向关联
一对一主键关联:在从表的一方加入<one-to-one constrained="true">还需要在主表加入<one-to-one>
一对一外键关联:除了在从表中加入<many-to-one unique="true">也需要在主表加入<one-to-one>
一对多双向关联:除了在一方中加入<set><one-to-many></set>还需要在多放加入<many-to-one>
多对多双向关联:需要在两方都加入<set><many-to-many></set> 注:<set>中的table="表名" 表明两方的配置要一样
<set ame="关联对象的属性名" table="生成一张新表">
<key column="当前对象数据库表的外键"/>
<many-to-many class="关联对象的类路径" column="关联对象数据库表的外键">
</set>
多对一双向关联:要在多方中加入<many-to-one>还要在一方中加入<set>
<set>
<key column="关联外键"/>
<one-to-many>
</set>