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多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级 ...
随机推荐
- 关于.net 2.0 remoting 中 TCP Channel 用户认证探讨(一)
http://www.cnblogs.com/scucj/archive/2007/05/09/740808.html
- Objective-c的@property 详解
转自:http://www.cnblogs.com/andyque/archive/2011/08/03/2125728.html 之前很多网友对我翻译的教程中的Property的使用感到有些迷惑不解 ...
- Node.js用fs.renameSync报cross-device link not permitted错
转自: http://blog.csdn.net/starrexstar/article/details/8048722 今天把 Manuel Kiessling 的[The Node Beginne ...
- 禁止Chrome浏览器自动升级
对于我们测试人员来说,浏览器自动升级是非常可怕的,浏览器的升级会导致出现各种bug,比如我们常用的Selenium,如果Chrome浏览器自动升级就会导致脚本出错,无法打开浏览器等等情况,对于这种情况 ...
- spring boot文件上传、下载
主题:Spring boot 文件上传(多文件上传)[从零开始学Spring Boot]http://www.iteye.com/topic/1143595 Spring MVC实现文件下载http: ...
- 【转】用python实现简单的文本情感分析
import jieba import numpy as np # 打开词典文件,返回列表 def open_dict(Dict='hahah',path = r'/Users/zhangzhengh ...
- RCC—使用 HSE/HSI 配置时钟 ---时钟树
本章参考资料:< STM32F4xx 中文参考手册> RCC 章节.学习本章时,配合< STM32F4xx 中文参考手册> RCC 章节一起阅读,效果会更佳,特别是涉及到寄存器 ...
- C#里面的枚举与位或运算符 一个枚举变量存入多个值
以前我们如果定义一个枚举类型 ,然后定义一个枚举变量,那么这个枚举变量只能为类型中的一个值,现在我们想要一个变量能够代表多个值: 今天看<Pro Net 2.0 Windows Forms An ...
- scala中计算的的一个小问题,超出Int.maxValue时不会报错
如果小于Int.max时他不会报错 def sumcount(str:String): Int ={ val ints = for(c <- str)yield { println(c.asIn ...
- PHP——0127加登录页面,加查询,加方法,加提示框
数据库mydb 表格info,nation,login 效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...