Hibernate表与表之间的关系映射

一对多关系

一个student有多个作业,所以student表中的记录和homework表中的记录形成1对多关系
表中字段体现在homework表中具有S_ID字段,表示该记录对应的作业属于哪个学生
在这里插入图片描述

1.单向一对多

数据表Student表对应java中的Student类,homework表对应Homework类
单向一对多是只从多的一段维护关联关系,即Homework类中存储了其对应的student的引用
在这里插入图片描述
hbm映射文件的配置
在这里插入图片描述
除了基础字段的映射,关联字段同样需要映射,多个homework对应一个student,所以使用Many-to-one,name属性指定属性名,column指定表中哪个列作为外键,class指明多对一的一那一段是哪个类。

添加操作
在这里插入图片描述

先保存1的一段,因为在插入homework时,student的OID已经存在所以只会发送3条insert语句
但是如果先保存homework再保存student,因为保存homework时,student的OID还没有确定,所以只有当插入student时,OID才确定下来,因此会多发送两条update语句给S_ID赋值
在这里插入图片描述

查询操作
在这里插入图片描述
因为1的一端没有任何额外的属性,所以查询1的一段没有什么特殊
但是N的一段保存有对应的student的引用,再查询的时候会将其查询出来吗?
在这里插入图片描述
我们看到好像并没有把student查询出来,但是此时我们的homework里面的student就是null吗?
在这里插入图片描述

在这里插入图片描述
我们发现原来此时的student引用是一个代理对象,只有我们真正要使用到对应的student的属性时才会进行查询初始化。
在这里插入图片描述
在这里插入图片描述
修改操作
修改操作没有什么需要注意的点,因此
在这里插入图片描述

在这里插入图片描述
删除
删除时注意不能先删除1的一段,否则将会抛出异常
在这里插入图片描述
在这里插入图片描述

双向1对多

双向1对多相较于单向1对多,1的一段多出了对多的一端的引用的集合
在这里插入图片描述

hbm配置文件中,在1的一端的配置文件需要加入set集合
在这里插入图片描述

添加操作
在这里插入图片描述
可以看到尽管这次我们先保存了1的一端在保存了N的一端,依旧多了两条update语句
在这里插入图片描述
这是因为1的一端和N的一端都在维护关联关系
1的一端在执行save操作时,所持有的homework集合中的homework对象的OID都没有分配,
而插入homework对象后,因为student已经save了所以此时N的一端不会维护关联关系,但是因为此时student持有的集合中的homework对象OID发生了赋值,所以会发送update语句。
根据上面的分析,我们进行先插入N的一端再插入1的一端就会多出四条insert语句在这里插入图片描述

查询操作
查询N的一端和之前相同,student会使用懒加载技术,而查询1的一端同样使用了懒加载技术,并且返回的代理集合对象使用的是hibernate提供的对set接口的子类实现,所以在student类中所定义的hoemwork属性应该使用为Set<>接口类型在这里插入图片描述
修改和删除操作
和单向1对多基本相同,注意不能直接删除外键列所对应得直接记录

在前面增删改查操作中漏了一些内容,在这里进行补充
1.懒加载异常
我们注意到不管是查询1的一端还是n的一端,hibernate并不会把和当前查询有关的关联表的记录直接查询出来,而是返回一个代理对象,但是当我们中途将session进行关闭,然后再想使用代理对象的属性时,这时候就会抛出懒加载异常
2.级联删除
我们发现我们总是不能先删除1的一端的记录,时因为我们在n的一端有记录和1的一端对应,但是当我们设置了级联删除时,那么删除1的一端的同时,会将n的一端的同时删除。
在这里插入图片描述
3.inverse反转
当我们进行双向1对多的关联关系时,两端都会进行关联关系的维护,这样会多出很多update语句,所以我们可以使得n的一端进行关系的维护,而1的一端不维护,提高程序的效率。

一对一关联关系

一对一关联关系,例如一个部门只有一个经理,对应数据库中的表有 dept 和manager表

基于外键的一对一关联

在dept表中,我们可以存在一个记录managerID的外键列,并给该列加上唯一约束表示一个部门只对应一个manager

在这里插入图片描述
在这里插入图片描述
//增删改查操作同1对多

基于主键的一对一关联

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实际上基于主键的一对一关系就是利用主键充当外键来维护关联关系

多对多关系

多对多关系需要中间表的协助
例如学生和课程
学生能选多个课程,一个课程也有很多学生,那么就需要学生选课表,对应哪个学生学了什么课程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对应的域模型
在这里插入图片描述
在这里插入图片描述

在两个实体类对象中都存在对方的集合引用,所以都使用set和many-to-many
在这里插入图片描述
在这里插入图片描述
注意需要取消一方的关系维护,不然会产生主键冲突。
因为在pupil维护关系时已经在中间表插入了对应的记录,而在Course进行维护时,则会重复插入。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同时查询一端对象也会使用代理对象返回,最后内连接进行查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值