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的多对多映射关系的更多相关文章

  1. hibernate笔记--单(双)向的多对多映射关系

    在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...

  2. hibernate(四) 双向多对多映射关系

    序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...

  3. Hibernate学习(四)———— 双向多对多映射关系

    一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设置吗? ...

  4. Hibernate中的一对一映射关系

    Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...

  5. java框架篇---hibernate(多对多)映射关系

    以学生和老师为例的来讲解多对多映射. 实体类: Student package cn.itcast.g_hbm_manyToMany; import java.util.HashSet; import ...

  6. Hibernate(五)之一对多&多对一映射关系

    既然我们讲到了一对多和多对一关系,必然要提到多表设计的问题.在开发中,前期需要进行需求分析,希求分析提供E-R图,根据ER图编写表结构. 我们知道表之间关系存在三种: 一对多&多对一:1表(主 ...

  7. SSH框架之Hibernate(1)——映射关系

    ORM的实现思想就是将关系数据库中表的数据映射成对象.以对象的形式展现,这样开发者就能够把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想 ...

  8. Hibernate的七种映射关系之七种关联映射(二)

    继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.pri ...

  9. Hibernate的七种映射关系之七种关联映射(一)

    关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级 ...

随机推荐

  1. 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 网上有好几种单页应用转seo的方案,有服务端渲染ssr.有预渲染prerender.google抓AJAX.静态化...这些方案都各有优劣,开发者可以根据不同的 ...

  2. path方法总结

    $.mobile.path.get(url);//获取URL地址的目录部分,就是除了a.html之外的那部分 jQuery.mobile.path.getDocumentBase(bool) //获取 ...

  3. locatin

    //location对象 //初始url:http://www.wrox.com/WileyCDA: //将URL修改为:http://www.wrox.com/WileyCDA/#section1 ...

  4. jquery的defer

    deferred.promise() 和 .promise() 这两个API语法几乎一样,但是有着很大的差别.deferred.promise()是Deferred实例的一个方法,他返回一个Defer ...

  5. linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结(转载)

    Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...

  6. ldap 使用 问题参考

    Q2.ldapsearch查询一个有30000多条记录时出现:Size limit exceeded 4 A2:服务器端配置文件有sizelimit 1000的限制!用管理员身份查询-D"c ...

  7. CSS——div居中,window.open(0

    margin:0 auto 表示什么意思?? margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right因为0 auto,表示上下边界为0,左右则根据宽度自适 ...

  8. css样式整理

    字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 {font-style: obl ...

  9. linux -- 查看ip,路由,dns

    查看ip地址:ifconfig 查看gateway:route 查看dns:nm-tool

  10. php -- 设计模式 之 单例模式

    实现单例的条件:三私一公 三私:私有化构造方法:不让外部创建对象 私有化克隆方法:不让外部克隆对象 私有静态属性:保存已经产生的对象 一公:公共静态方法:在类内部创建对象 实例: <?php / ...