系统设计的实体间关系分别为:一对一,一对多(多对一),多对多

一、一对多(多对一)

  一对多,多对一其实一样,只是站在不同的角度看,这种情况在多的一方添加一的一方的主键为外键。以学生Student和班级Grade为例介绍一对多关联关系在hibernate映射文件中的配置。

Student.hbm.xml映射文件配置(多的一方有外键)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-9 15:15:47 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.imooc.entity.Student" table="STUDENT"><id name="sid" type="int"><column name="SID" /><generator class="increment" /></id><property name="sname" type="java.lang.String"><column name="SNAME" /></property><property name="sex" type="java.lang.String"><column name="SEX" /></property><many-to-one name="grade" class="com.imooc.entity.Grade" fetch="join"><column name="gid" /></many-to-one></class>
</hibernate-mapping>

Grade.hbm.xml映射文件配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-8 23:10:39 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.imooc.entity.Grade" table="GRADE"><id name="gid" type="int"><column name="GID" /><generator class="increment" /></id><property name="gname" type="java.lang.String"><column name="GNAME" /></property><property name="gdesc" type="java.lang.String"><column name="GDESC" /></property><!-- 一个班级对应多个学生,在班级映射文件中添加set属性,设置inverse为true则一方Grade不再进行维护关联信息(由多方维护)由于多方已知一方的信息,提高性能。设置级联属性cascade,则在保存班级信息会自动把学生信息(如果不存在)保存到数据库中--><set name="students" table="STUDENT" inverse="true" lazy="true" cascade="save-update"><key><!-- 确定关联的外键列 --><column name="gid" /></key><!-- 映射到关联类的属性 --><one-to-many class="com.imooc.entity.Student" /></set></class>
</hibernate-mapping>

二、一对一

  一对一其实是特殊的一对多关系,在任意一方引入对方的主键作为外键(实际使用非常少)。在映射文件中只需将多对一的unique设为true,以球队与地址为例说明。

Address.hbm.xml映射文件配置

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.suxiaolei.hibernate.pojos.Adress" table="adress"><id name="id" type="integer"><column name="id"></column><generator class="increment"></generator></id><property name="city" column="city" type="string"></property><one-to-one name="team" class="com.suxiaolei.hibernate.pojos.Team" cascade="all"></one-to-one></class>
</hibernate-mapping>

Team.hbm.xml映射文件配置(在many-to-one 加入unique=“true”,并且将Address的id作为外键)

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.suxiaolei.hibernate.pojos.Team" table="team"><id name="id" type="integer"><column name="id"></column><generator class="increment"></generator></id><property name="name" column="name" type="string"></property><many-to-one name="adress" class="com.suxiaolei.hibernate.pojos.Adress" column="adress_id" unique="true"></many-to-one></class>
</hibernate-mapping>

三、多对多

  多对多关系需要产生中间关系表,并引入两张表的主键作为外键。以project和employee为例说明

project.hbm.xml映射文件配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-9 15:55:46 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.imooc.entity.Project" table="PROJECT"><id name="proId" type="int"><column name="PROID" /><generator class="assigned" /></id><property name="proName" type="java.lang.String"><column name="PRONAME" /></property><!-- 多对多配置,相对于与两表有联系的新表进行配置 --><set name="employees" table="proemp" cascade="save-update"><!-- 确定关联的外键列 --><key><column name="rproid"></column></key><!-- 集合属性所对应的持久化类,以及关联的外键列 --><many-to-many class="com.imooc.entity.Employee" column="rempid"></many-to-many></set></class>
</hibernate-mapping>

employee.hbm.xml映射文件配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-9 15:55:46 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.imooc.entity.Employee" table="EMPLOYEE"><id name="empId" type="int"><column name="EMPID" /><generator class="assigned" /></id><property name="empName" type="java.lang.String"><column name="EMPNAME" /></property><!-- 多对多配置,相对于与两表有联系的新表进行配置 --><set name="projects" table="proemp" inverse="true"><!-- 确定关联的外键列 --><key><column name="rempid"></column></key><!-- 集合属性所对应的持久化类,以及关联的外键 --><many-to-many class="com.imooc.entity.Project" column="rproid"></many-to-many></set></class>
</hibernate-mapping>

四、关系中的反转与级联说明

  反转通过映射文件中对集合的inverse属性的设置,来控制关联关系。默认值为false,则关系两方都可以控制,可能在更新时会造成重复更新的情况,降低系统性能,在多对多关系中,如果两方都能控制并进行更新操作则可能报错。以project和employee为例,如果两方都添加另一方到set集合中,则中间表proemp会添加进两条相同的记录则会报错。

  通常的做法是在一对多关系中,将一的一方的inverse设为true(因为多的一方有外键可以知道一方的情况),由多的一方维护关联关系;在多对多关系中,在任意一方设置都可。

  级联是当一方进行保存,更新或删除操作时,其关联对象也执行相同操作。映射文件中通过对cascade属性设置控制是否对关联对象采用级联操作。

  在一对多关联关系执行保存操作时,如果不进行级联操作只保存Grade,则会报错,因为持久态对象grade关联了瞬时态对象Student,这种情况不允许保存,可设置grade映射文件的cascade="save-update",多对多关系也适用级联保存。

  级联删除:在一对多关系中,如果删除grade记录则与之相关的student的gid属性为null(未设置级联删除),使用级联删除可将与之相关的student都删除。

    多对多关系的级联删除也叫双向级联删除,删除某个学生时,与之关联的课程都要被删除,而与被关联课程相关的其他学生也需要删除。

转载于:https://www.cnblogs.com/simple96/p/7327772.html

Hibernate的关联关系映射相关推荐

  1. Hibernate 实体关联关系映射----总结

    http://lavasoft.blog.51cto.com/62575/39398 Hibernate 实体关联关系映射----总结 花了三天的业余时间,终于写完了Hibernate关联关系映射的所 ...

  2. 框架之 hibernate之关联关系映射

    案例:完成CRM的联系人的保存操作 需求分析 1. 因为客户和联系人是一对多的关系,在有客户的情况下,完成联系人的添加保存操作 技术分析之Hibernate的关联关系映射之一对多映射(重点) 1. J ...

  3. Hibernate实体关联关系映射

    一.什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对 ...

  4. Hibernate关联关系映射

    1.  Hibernate关联关系映射 1.1.  one to one <class name="Person"> <id name="id" ...

  5. Hibernate关联关系映射实例速查

    Hibernate关联关系映射实例速查 Hibernate的映射关系很多,也比较复杂,也很容易忘记.这个基本上占据了Hibernate学习的七成时间.熟悉这些映射模型,需要大量的实践才能掌握.下面是我 ...

  6. (转)Hibernate框架基础——多对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...

  7. (转)Hibernate框架基础——一对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础--映射集合属性详细讲解的是值类型的集合(即 ...

  8. Hibernate关联关系映射之一对一关联关系

    人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 ...

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

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

最新文章

  1. python 模拟键盘_python+selenium模拟键盘输入
  2. Asp.Net.Core 系列-中间件和依赖注入进阶篇
  3. Git笔记(二)——[diff, reset]
  4. Median String
  5. ubuntu安装java的rpm_ubuntu安装jdk-6u45-linux-x64-rpm.bin
  6. JDK和JRE的区别、下载并安装JDK
  7. mysql中的各种函数(日期函数、字符串函数、数学函数...)
  8. 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统
  9. 全网首发:无线网桥的延迟太大,有时达到10秒以上
  10. 亿图图示:分享你的流程图给你的小伙伴
  11. 【040】翼辉信息与中国通号集团战略合作签约仪式圆满举行
  12. 英特尔傲腾内存linux,英特尔至强6226R处理器性能测评,支持英特尔傲腾持久内存...
  13. it超火图片熊猫头你最成功表情包合集
  14. 3d胆码计算机方法,3D百十个位定胆技巧准确率95
  15. jupyter notebook报错500 : Internal Server Error
  16. WIN 10 系统Alt + Tab 切换窗口卡顿问题结局方案
  17. APS高级排产软件解析
  18. 光速入门MyBatis-Plus
  19. 智能开关继电器-选型篇2
  20. 阿里云免费SSL证书没有了?有!(免费证书新攻略)

热门文章

  1. mysql whrere 占位_【MySQL】(4)操作数据表中的记录
  2. 计算机专业的学员为什么要学erp,对要进入计算机专业学习的人的小小建议(浅谈)...
  3. java opencv 开发环境_Java + opencv学习:在Eclipse下配置基于Java的OpenCV开发环境
  4. react native报错:Expected a component class,got[object object]
  5. 免费Java高级工程师学习资源,使用指南
  6. mysql mydumper_mysql数据库备份之mydumper
  7. list循环添加数据_List 去除重复数据的 5 种正确姿势!你知道几种?
  8. redis stream java消息队列_Redis-消息队列的两种实现方式
  9. c语言的适当大小的子集,编译原理上机实验报告
  10. 网站推广——网站推广专员浅析如何轻松完成网站关键词优化?