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多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级 ...
随机推荐
- AESDK从流中获得变换信息
AE中Transform下的信息位于流中,和别的软件不太一样. 如果是特效的参数信息要从EffectSuites中获取,默认的参数信息基本上StreamSuites都可以得到 需要注意,取得流之后也要 ...
- Atitit.网页爬虫的架构总结
Atitit.网页爬虫的架构总结 1. 总数的结构..(接口方法) 1 2. 获得页数 1 3. 跳页处理(接口方法) 2 4. 单个的页面处理(接口方法) 2 4.1. 获得页面url 3 4.2. ...
- Qt5中的QtGui
我在学习Qt查看Qt Creater提供的例子时,遇到了一个小问题.就是明明在代码中包含了QtGui,然而编译的时候还是提示找不到QLabel的定义,以及其他一些类的定义,但是这是官方提供的文档的啊, ...
- EXTI—外部中断/事件控制器
外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线.每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测. EXTI 可以实现对每个中断/事件线进行单独 ...
- pyqt加载图片
使用QPixmap可以加载图片,但是图片只能是标准二进制文件格式: bmp,gif,ico,jpeg,jpg,mng,pbm,pgm,png,ppm,svg,svgz,tga,tif,tiff,xbm ...
- Odoo 8.0 new API 概述
相对于7来说,8的api改进了不少,用官方的话来说就是更加面向对象了. 下面探究一下具体的改动. 准备知识:python装饰器的使用 http://blog.csdn.net/thy38/articl ...
- RabbitMQ之任务队列【译】
在第一个教程里面,我们写了一个程序从一个有名字的队列中发送和接收消息,在这里我们将要创建一个分发耗时任务给多个worker的任务队列. 任务队列核心思想就是避免执行一个资源密集型的任务,而程序要等待其 ...
- maven远程私服发布jar包
配置项目POM.xml <distributionManagement> <repository> <id>nexus-releases</id> &l ...
- Android基础总结(二)布局,存储
常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRightOf="@id/tv1" 设置在指 ...
- 多个 label checkbox 组合 显示在同一个水平线上[前提Bootstrap框架]
<th align="left" valign="middle"> <label class="checkbox inline fo ...