Hibernate之关联映射
在现实生活中 ,很少有对象是孤立存在的,例如老师,往往和被授课的学生存在关联关系,如果得到了某个老师实例,那么我们就可以直接获取该老师
对应的全部学生。同样,我们得到了一个学生实例 ,我们也可以获取所有教授他课程的老师。
关联关系大致可以分为两类 :
单向关联 :只需单向访问关联端。
双向关联:关联的两端可以互相访问。
首先来看双向关联:
双向 1—1关联:
这里使用 人与身份证的例子
双向:通过一个人(存在主数据表中) 我们可以找到这个人的身份证(存在从数据表中) 通过一个身份证 也可以找到人
(在代码中的体现是 通过Person类的实例对象,通过get方法可以拿到IDCard类的实力对象;通过IDCard类的实例对象,通过get方法可以拿到Person类的实例对象。
所以双方的类中需要互相定义一个对方的属性 )
1-1:主数据表的一个人 只能对应于从数据表中的 一个身份证 一个身份证也只能对应于一个人
双向1-1关联又可以根据使用的关联字段分为 基于外键的双向1-1关联 基于主键的双向1-1关联
基于外键的双向1-1关联
持久化类 Person类 有一个 IDCard类型的属性 private IDCard idcard;
持久化类 IDCard类 有一个 Person类型的属性 private Person person;
映射文件配置 :
<class name="org.lingtong.pojo.Person" table="tb_person">
<id name="id" column="id">
<generator class="native" /> //指定tb_person表的主键生成策略
<id>
...... //省略 name属性 sex属性与对应数据列的映射关系
<one-to-one name="idcard" property-ref="person"></one-to-one>
</class>
<class name="org.lingtong.pojo.IDCard" table="tb_IDCard">
<id name="id" column="id">
<generator class="native" /> //指定tb_IDCard表的主键生成策略
<id>
...... //省略 code属性与对应数据类的映射关系
<many-to-one name="person " column="p_id" unique="true" not-null="true"></many-to-one> //p_id列会去关联主表的主键列
</class>
基于主键的双向1-1关联
持久化类 Person类 有一个 IDCard类型的属性 private IDCard idcard;
持久化类 IDCard类 有一个 Person类型的属性 private Person person;
映射文件配置:
<class name="org.lingtong.pojo.Person" table="tb_person">
<id name="id" column="id">
<generator class="native" /> //指定tb_person表的主键生成策略
<id>
...... //省略 name属性 sex属性与对应数据列的映射关系
<one-to-one name="idcard" property-ref="person"></one-to-one>
</class>
<class name="org.lingtong.pojo.IDCard" table="tb_IDCard">
<id name="id" column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
........ //省略 code属性 与对应数据列的映射关系
<one-to-one name="person" constrained="true"></one-to-one>
</class>
双向1-N关联:
这里使用人与房产的例子
双向:通过一个人(存在主数据表中)可以找到这个人的所有房产(存在从数据表中) 通过一处房产 我们可以找到拥有这处房产的那个人
(在代码中的体现是 通过Person类的实例对象,通过get方法可以拿到存有House类的实力对象的集合;通过House 类的实例对象,通过get方法可以拿到Person类的实例对象。
所以双方的类中需要互相定义一个对方的属性 )
1-N : 一个人可以拥有多处房产 但一处房产只能对应于一个人
持久化类 Person类 拥有一个集合类型(该集合中存House类型对象)的属性 private Set<House> houseList;
持久化类 House类 用于 一个Person类型的属性 private Person person;
映射文件配置 :
<class name="org.lingtong.pojo.Person" table="tb_person">
<id name="id" column="id">
<generator class="native" /> //指定tb_person表的主键生成策略
<id>
...... //省略 name属性 sex属性与对应数据列的映射关系
<Set name="houseList" inverse="true"> //inverse属性表示是否把这种 关联关系 交给对方表去管理(Hibernate推荐把关系交给N的一端去管理)
<key column="p_id"></key> //如果使用的是list或者其他集合类型 可以添加<list-index>等相关元素
<one-to-many class="org.lingtong.pojo.House"></one-to-many>
</Set>
</class>
<class name="org.lingtong.pojo.House" table="tb_house">
<id name="id" column="id">
<generator class="native" /> //指定tb_house表的主键生成策略
<id>
......... //省略 address属性与对应数据类的映射关系
<many-to-one name="person" column="p_id" not-null="true"></many-to-one>
</class>
双向N-N关联
这里是教师与学生的例子
双向 :通过一个老师(存在主数据表中) 可以访问 他所带的每一个学生(存在从数据表中)
(在代码中的体现是 通过Teacher类的实例对象,通过get方法可以拿到存有Student类的实力对象的集合;通过Student 类的实例对象,通过get方法可以拿到存有Teacher类的实例对象的集合。
所以双方的类中需要互相定义一个对方的属性 )
N-N : 一个老师 可以带多个学生 一个学生可以由多个老师 (所带科目不同)
双向多对多的关联 需要借助第三方表 ----中间表
持久化类 Teacher类 拥有一个集合类型(该集合中存放Student类型的对象)的属性 private Set<Student> studentSet;
持久化类 Student类 拥有一个集合类型(该集合中存放Teacher类型的对象)的属性 private Set<Teacher> teacherSet;
映射文件配置 :
<class name="org.lingtong.pojo.Teacher" table="tb_Teacher">
<id name="id" column="id">
<generator class="native" />
</id>
...... //省略 teacherName 属性 与 subject属性与对应列的映射关系
<set name="studentSet" table="tb_teacher_student">
<key column="t_id" ></key>
<many-to-many column="s_id" class="org.lingtong.pojo.Student"></many-to-many>
</set>
</class>
<class name="org.lingtong.pojo.Student" table="tb_Student">
<id name="id" column="id">
<generator class="native" />
</id>
...... //省略 studentName 属性 与 class属性与对应列的映射关系
<set name="studentSet" table="tb_teacher_student">
<key column="s_id" ></key>
<many-to-many column="t_id" class="org.lingtong.pojo.Teacher"></many-to-many>
</set>
</class>
相对于较为复杂的双向关联 ,单向关联稍微简单
转载于:https://www.cnblogs.com/wangliyue/p/4151862.html
Hibernate之关联映射相关推荐
- 初识Hibernate之关联映射(一)
上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...
- Hibernate的关联映射--一对多、
这是我 1 单向一对多: 实体类:(课程类)Grade与(学生类)Student的一对多关系 学生类: public class Student implements java.io.Serializ ...
- 8 Hibernate:关联映射(Associations)
Hibernate 关联映射(Associations)分为: 8.1 Hibernate:一对一关联映射 8.1.1 Hibernate:一对一单向关联(unidirectional) ...
- chapter6 Hibernate的关联映射
回顾 · 下面这个异常是怎么回事?该怎么解决? org.hibernate.MappingException: Unknownentity: com.aptech.jb.entity ...
- Hibernate一对一关联映射配置
一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保 ...
- [置顶] Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
- [置顶] Hibernate从入门到精通(十一)多对多双向关联映射
上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...
- Hibernate(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...
- Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
最新文章
- MyBatis之传入参数
- Qt5 使用 #pragma 加载 lib 文件的注意事项
- 10gocm-gt;session3-gt;数据备份与恢复
- 30 个很棒的 PHP 开源 CMS 内容管理系统
- HDU1856_More is better
- 【ARM-Linux开发】U-Boot启动过程--详细版的完全分析
- 简单的java图像裁减
- 【C语言】双人格斗小游戏(源码)
- C语言嵌入式系统编程修炼之软件架构篇
- 同问 集成网卡和独立网卡哪个好?
- countif函数比较两列不同_Excel如何对比两列姓名找出两列相同和不同的姓名有哪些方法...
- java 多音词语转拼音_py4j汉语转拼音多音字处理
- 人肉搜索酝酿灰色产业:首批淘客月入万元
- 一道面试题:你了解哪些编译器优化行为?知道Copy elision 、RVO吗?
- [No0000C7]windows 10桌面切换快捷键,win10
- php汉字转为拼音方法一
- Python_对折多少次超过珠峰
- php yield 返回值,[PHP] yield沟通函数循环内外
- 最新红旗linux系统,红旗Linux操作系统
- 使用 canvas 实现 js 取渐变色某段色值
热门文章
- rabbitmq 消息长度_Spring Boot教程(29) – RabbitMQ必备基础
- Git Branch Mode(分支模式)
- 6-1 线性表元素的区间删除 (10 分)
- java获取运行时对象,java 面向对象(四十一):反射(五)反射应用二:获取运行时类的完整结构...
- android 在线设计工具,21个免费的UI界面设计工具、资源及网站
- idou老师教你学Istio 07: 如何用istio实现请求超时管理
- 用户不在sudoers文件中,此事将被报告
- 【Python学习笔记】Coursera课程《Python Data Structures》 密歇根大学 Charles Severance——Week6 Tuple课堂笔记...
- Apache 403 错误。。
- css实现两端对齐的3种方法