Hibernate的多对多映射关系
example:
老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢??
在Hibernate中多对多关系分为两种:1单向的多对多,2双向的多对多
下面详细说明一些两种有什么不同和实现步骤
I单向的多对多实现步骤:
1新建teacher、student表,可以任意选择在其中一个表添加另一个表的集合,(例如在teacher中添加student的set<Student>集合,例如private set<student> students)
代码如下:
teacher:
package com.atguigu.hibernate.n2n; import java.util.Set; public class Teacher {
private Integer ID;
private String Name;
private Set<Student> students;
public Integer getID() {
return ID;
}
public void setID(Integer iD) {
ID = iD;
}
public String getTea_Name() {
return Name;
}
public void setTea_Name(String Name) {
this.Name =Name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} }
Student:
package com.atguigu.hibernate.n2n; public class Student {
private Integer S_ID;
private String s_Name;
public Integer getS_ID() {
return S_ID;
}
public void setS_ID(Integer s_ID) {
S_ID = s_ID;
}
public String getS_Name() {
return s_Name;
}
public void setS_Name(String s_Name) {
this.s_Name = s_Name;
} }
2在有set集合属性的持久化类的.hbm.xml文件里添加集合信息和many-to-many信息,另外一个表的.hbm.xml文件跟平常一样即可
teacher:
<?xml version="1.0"?>
<!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.atguigu.hibernate.n2n.Teacher" table="TEACHER"> <id name="ID" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id> <property name="Name" type="java.lang.String" access="field">
<column name="NAME" />
</property>
<!--
name:set集合的名字
Table:中间表的名字
key--column:中间表的外键列的名字,这个类的值就是属于<class name="">这个类的ID值
many-to-many的column:也是指定中间表的外键列的名字,这列的值就属于many-to-many的class类的ID值
-->
<!---注释部分可能会引起XML格式错误,--->
<set name="students" table="t_s_Connection">
<key>
<column name="T_ID" />
</key>
<many-to-many class="com.atguigu.hibernate.n2n.Student" column="S_ID"/>
</set> </class>
</hibernate-mapping>
student:
<?xml version="1.0"?>
<!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.atguigu.hibernate.n2n.Student" table="STUDENT"> <id name="S_ID" type="java.lang.Integer">
<column name="S_ID" />
<generator class="native" />
</id> <property name="s_Name" type="java.lang.String">
<column name="S_NAME" />
</property> </class>
</hibernate-mapping>
然后配置一下Hibernate.cfg.xml文件即可
单向的多对多关系,就是这样了,但是其的增删改查又有什么特点???这个稍后再探究
II双向的多对多关系如何配置
1在双方持久化类(就是teacher和student)中互相添加对方的对象集合,并且当中有一个需要实例化
例如:在teacher中添加private set<student>
在student中添加private set<teacher>=new hashSet<teacher>();
代码:teacher:
package com.atguigu.hibernate.n2n; import java.util.Set; public class Teacher {
private Integer ID;
private String Name;
private Set<Student> students;
public Integer getID() {
return ID;
}
public void setID(Integer iD) {
ID = iD;
}
public String getTea_Name() {
return Name;
}
public void setTea_Name(String Name) {
this.Name =Name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} }
student:
package com.atguigu.hibernate.n2n; import java.util.HashSet;
import java.util.Set; public class Student {
private Integer S_ID;
private String s_Name;
private Set<Teacher> teachers=new HashSet<Teacher>(); public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
public Integer getS_ID() {
return S_ID;
}
public void setS_ID(Integer s_ID) {
S_ID = s_ID;
}
public String getS_Name() {
return s_Name;
}
public void setS_Name(String s_Name) {
this.s_Name = s_Name;
} }
2在双方的持久化类中添加set和many-to-many设置
teacher.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">
<hibernate-mapping>
<class name="com.atguigu.hibernate.n2n.Teacher" table="TEACHER"> <id name="ID" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id> <property name="Name" type="java.lang.String" access="field">
<column name="NAME" />
</property>
<!--
name:set集合的名字
Table:中间表的名字
key--column:中间表的外键列的名字(可以放任意名字),就是指明中间表的外键列是当前持久化类的的ID属性
many-to-many的column:也是指定中间表的外键列的名字,这列的值就属于many-to-many的class类的ID值
-->
<set name="students" table="t_s_Connection">
<key>
<column name="T_ID" />
</key>
<many-to-many class="com.atguigu.hibernate.n2n.Student" column="S_ID"/>
</set> </class>
</hibernate-mapping>
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">
<hibernate-mapping>
<class name="com.atguigu.hibernate.n2n.Student" table="STUDENT"> <id name="S_ID" type="java.lang.Integer">
<column name="S_ID" />
<generator class="native" />
</id> <property name="s_Name" type="java.lang.String">
<column name="S_NAME" />
</property>
<set name="teachers" table="t_s_Connection">
<key>
<column name="S_ID"></column> </key>
<many-to-many class="com.atguigu.hibernate.n2n.Teacher" column="T_ID"></many-to-many>
</set>
</class>
</hibernate-mapping>
然后在Hibernate.cfg.xml文件配置一下mapping-resource即可
但是双向的多对多关系的增删改查又是怎样的呢??
而且单向的多对多关系和多向的多对多关系两者有什么不同,有什么有缺点??
Hibernate的多对多映射关系的更多相关文章
- hibernate笔记--单(双)向的多对多映射关系
在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...
- hibernate(四) 双向多对多映射关系
序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...
- Hibernate学习(四)———— 双向多对多映射关系
一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设置吗? ...
- Hibernate中的一对一映射关系
Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...
- java框架篇---hibernate(多对多)映射关系
以学生和老师为例的来讲解多对多映射. 实体类: Student package cn.itcast.g_hbm_manyToMany; import java.util.HashSet; import ...
- Hibernate(五)之一对多&多对一映射关系
既然我们讲到了一对多和多对一关系,必然要提到多表设计的问题.在开发中,前期需要进行需求分析,希求分析提供E-R图,根据ER图编写表结构. 我们知道表之间关系存在三种: 一对多&多对一:1表(主 ...
- SSH框架之Hibernate(1)——映射关系
ORM的实现思想就是将关系数据库中表的数据映射成对象.以对象的形式展现,这样开发者就能够把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想 ...
- Hibernate的七种映射关系之七种关联映射(二)
继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.pri ...
- Hibernate的七种映射关系之七种关联映射(一)
关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级 ...
随机推荐
- Facebook API 入门
Facebook 商业价值简介 Facebook 是一个社交网络服务网站,于 2004 年 2 月 4 日上线,到 2010 年 2 月 2 日, Facebook 正赶超雅虎将成为全球第三大网站,与 ...
- MySQL 5.7 双主复制+keepalived,常规业务一般够用了
业务需求: 为Zabbix搭建2个数据库,一个库给服务器监控用,一个库给网络监控用. 硬件: 两台服务器,硬盘是1.2 T SSD卡,内存128G 架构: 希望做双主复制+keepalived,架构大 ...
- jMiniLang设计思路
前言 项目地址:https://github.com/bajdcc/jMiniLang 演示视频:https://www.bilibili.com/video/av13294962 jMiniLang ...
- FreeRTOS 任务优先级分配方案
任务优先级说明下面对 FreeRTOS 优先级相关的几个重要知识点进行下说明,这些知识点在以后的使用中务必要掌握牢固. FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h ...
- java中高并发和高响应解决方法
并发不高.任务执行时间长的业务要区分开看: 假如是业务时间长集中在I/O操作上,也就是I/O密集型的任务,因为I/O操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CP ...
- sqlmap如何跑base64加密了的注入点
其实http://www.cnblogs.com/xishaonian/p/6276799.html这个就是一个案例了. 但是不得不重写一篇文章来记载.因为这是一个姿势.很好的姿势. 保存为xisha ...
- love2d杂记9--光照效果
光照效果需要用shader,这个我一直没学,现在时间较少,先放到这里,有时间我再补,如果大家 发现好的opengl shader教程(如果没记错的love2d用的是glsl 1.1),推荐一下. 这里 ...
- Python中import和from import
Python里面的import和from import都是用于导入一个模块,两者的区别是 如果你在使用某模块内函数时不想写模块名,那么就用from import方式导入,如果是用import方式就要写 ...
- STM32CubeMX软件工程描述_USART配置过程
推荐 分享一个朋友的人工智能教程,零基础!通俗易懂!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前面 学习本文之前可以查 ...
- 树莓派+android things+实时音视频传输demo之遥控小车
做了个测试小车,上面安装了摄像头,通过外网进行视频传输: https://www.bilibili.com/video/av23817880/