建表原则

多对多:创建一个中间表,中间表至少有两个字段分别作为外键指向多对多双方的主键
一对一:唯一外键(Unique约束)对应、主键对应(某个表的主键作为另一个表的主键)
一对多:多的一方创建外键指向一的一方
例,老师与学生(一对多):

存储结构

存储多的一方,Hibernate默认使用Set集合

配置

①一对多(在一的一方存在外键与多的一方联系),在mapping中:
配置一,<many-to-one name=“属性名” class=“包.类” column=“当前表外键名称”/>
例:

<!-- 多对一  -->
<many-to-one name="teacher" class="com.mfqh.pojo.Teacher" column="tid" cascade="save-update"></many-to-one>

配置多,<set name=“属性名”><key column=“当前表外键名称”/><one-to-many class=“包.类”/>

<!-- 一对多 -->
<set name="students" cascade="save-update"><key column="tid"/><one-to-many class="com.mfqh.pojo.Student"/>
</set>

②多对多(存在一个中间表联系双方的主键,两个字段为联合主键,且作为外键与两个表相对应),两边分别配置

<set name="属性名" table="中间表表名"><key column="当前对象在中间表中对应的外键 /><many-to-one class="包.类" column="对方对象在中间表中对应的外键"/>
</set>

Ps:多对多时,若两边都做外键维护,则在添加数据时会向中间表添加两行相同数据,而这是不允许的(联合主键)

因此一般需要被动方放弃外键维护权
在进行对象关系添加时,需先查询两边对象,然后进行添加(.add() 即操做集合)
进行对象关系修改时,虚线查询两边对象,先进行删除(.remove),再进行添加(.add())

操做

当使用一个对象设置了另一个对象后,双方都存入数据库,会自动生成对应的外键

当只保存一边时,会报错:瞬时对象异常,即持久态对象(存入数据库)关联了瞬时态对象(未存)

级联(cacade)

定义:操做一个对象的时候,是否会同时操做关联对象
特点:级联是有方向性的(即两边都得配置)
配置:在set元素或many-to-one元素中添加属性cacade=“value”

value effect
save-update 级联添加或更新(添加一个对象时,同时添加与其相关联的对象)
delete 级联删除(默认方式为删除一方的数据,另一方外键赋为null;级联删除为两方数据都删除)

Ps:可同时设置两者,使用逗号隔开,而且应该先查询后删除,确保可通过集合或引用找到要级联删除的对象。

双向关系维护会产生多余SQL(inverse)

原理:更新数据时,若维护关系的双方对象都做出改变,即缓存区和快照区两个对象的数据都不一致
就会发送两条SQL语句(实则一条无用),会降低效率

例,学生更换老师:

Student student = session.get(Student.class, 1);
Teacher teacher = session.get(Teacher.class, 2);
student.setTeacher(teacher);
teacher.getStudents().add(student);

当产生多余SQL时,两边共同维护外键:

解决:
①单向维护(只设置一方关联)
②使一边放弃外键维护权(一的一方(包含set集合),在set元素添加属性inverse=“true”)

Hibernate框架 一对多,多对多映射相关推荐

  1. hibernate的一对多双向关联映射----客户和订单关系

    客户和订单关系:客户是一的一方,订单是多的一方. customer表: CREATE TABLE `customer` ( `ID` int(4) NOT NULL AUTO_INCREMENT , ...

  2. hibernate 映射表_Hibernate多对多映射-连接表

    hibernate 映射表 Today we will look into Hibernate Many to Many Mapping using XML and annotation config ...

  3. SSH:Hibernate框架(七种关联关系映射及配置详解)

    概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...

  4. hibernate中一对多关系的映射

    昨天初次接触hibernate,仅仅弄懂了一对一关系的映射.今天学习了一天又有了新的收获,弄懂了一对多之间关系的映射. 一.一对多的关系映射 建立一对多关系关系的表的原则是将一的一方的主键加入到多的一 ...

  5. Mybatis - 一对多/多对一映射

    文章目录 前言 项目结构 一.数据库表 1. 员工表 t_emp 2. 部门表 t_dept 二.实体类 1. Emp 员工实体类(添加多对一属性) 2. dept 部门实体类(添加一对多属性) 三. ...

  6. Hibernate关联关系映射-----双向一对多/多对一映射配置

    转自:http://blog.csdn.net/yifei12315/article/details/6985194 /// Hibernate: /// 双向关联就是有"一对多" ...

  7. Hibernate(五)多对多映射关系

    Many to Many 映射关系(没尝试映射hibernate支持的java类型) 双向多对多外键关联(XML/Annotation) (xml和annotation都实现了) 单向多对多外键关联( ...

  8. Hibernate多对多映射 - 连接表

    Hibernate多对多映射 - 连接表 今天我们将使用XML和注释配置来研究Hibernate多对多映射.之前我们看过如何在Hibernate中实现One To One和One To Many映射. ...

  9. hibernate 的一对多关联关系映射配置

    hibernate 是操作实体类: 表是一对多的关系,当创建这2个实体的时候 在一的一方定义一个多的一方的集合 在多的一方定义一个一的一方的对象 表是多对多的关系,当创建这2个实体的时候 在互相中都有 ...

最新文章

  1. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) B. Verse Pattern 水题
  2. Cocoa的MVC架构分析
  3. java一个点围着另一个点转_Java:按指定的度数值旋转另一个
  4. 定时器0工作方式1,定时1s
  5. safair 的css hack
  6. NOIP2018没有什么新闻
  7. Windows下进程通信的几种方式介绍
  8. AIR切换SDK版本时遇到的问题
  9. caffe常用格式binaryproto和leveldb
  10. 来自一个用户的体验-Alpha项目测试
  11. 算法分析中的空间复杂度
  12. 【TWVRP】基于matlab遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1177期】
  13. 带本信息论看《三体》——信息论课程论文
  14. windows如何解压tar.gz文件
  15. 思科交换机不同vlan互通
  16. springboot+websocket聊天室(私聊+群聊)
  17. Python统计微信消费!生成微信消费账单!真强大!
  18. ubuntu系统安装完nvidia显卡驱动后黑屏,不能进入系统
  19. 别人在你眼中是什么样,你就是什么样
  20. 手把手搭织梦模板网站教程

热门文章

  1. How to Install and Configure OpenSSH Server In Linux
  2. 更改Linux系统的Hostname的四种方式
  3. C语言,利用一维数组输出每月对应的天数。
  4. ofbiz mysql_ofbiz+mysql安装求教
  5. WinForm和WPF使用log4net
  6. leetcode 存在重复元素
  7. ajax前端实时获取数据
  8. 【Java】利用Swing实现登录页面
  9. 编写高质量代码的50条黄金守则-Day 04(首选字符串插值)
  10. C#设计模式之21-策略模式