`

九 多对多关系 学生<--->老师的关系

 
阅读更多
九 多对多关系 学生<--->老师的关系
多对多关系 学生<--->老师的关系 一个学生可以有多个老师 一个老师可以有多个学生
在多对多的关系的表 在操作和性能方面都不太理想,所以多对多的映射使用较少,
实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。

具体操作是这样的 比如说我们建一个老师表 teacher 和一个学生表 student 怎么让这两个表连成有关系的表呢 
可以这样去设计 设计一个中间表teacher_student 中间表里仅仅存的是teacher的id 和student的id 并且建一个主键,
主键是这两个键的组合键 我们只要把这两个id作为外键的形式存放在这个中间表中便可以了 然后由这个中间表去
跟teacher和student表建立关系便可以,这个关系就是一对多的关系 一个中间表跟两个表建立关系

那现在我们开始吧
先设计模型 

Teacher类 
package hibernate.many;

import java.util.Set;

public class Teacher {
  private int id;
  private String name;
  private Set<Student> students;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public Set<Student> getStudents() {
	return students;
}
public void setStudents(Set<Student> students) {
	this.students = students;
}
}


映射文件
<?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 
	package="hibernate.many">

	<class name="Teacher">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		
		<set name="students" table="teacher_student">
		<key column="teacher_id"/>
		  <many-to-many  class="Student" column="student_id"/>
		</set>
	</class>
	
</hibernate-mapping>

分析:比如说我们要根据teacher去查找student的信息 我们该怎样去查呢 
首先我们查找到teacher的信息 我们根据这个teacher的id 去查teacher_student中间表的数据
这样就可以查出student_id 这个student_id就是student的id 现在我们查学生就不难查出来了吧
看上面的配置 这是个实体类的映射文件 注意看set部分 set存的是什么 就是这个Teacher实体存的属性
属性名是什么 是students 看students其实就是这个实体的属性 上面class节点不是已经有默认的对应的表
吗?默认的对应的表也就是这个实体的表对应的表是小写的teacher名的表 那这里这个table是干嘛的呢 
这个啊 就是指定的中间表啊 这个中间表teacher_student在这里是一个条件存在的 说的是如果通过查老师
就可以查中间表了,查询的条件是什么呢?看key节点了吧 这个节点就是查询的条件,指的是这个中间表引用
当前Teacher的id作为外键存放到中间表的 好,现在就查中间表了,现在进一步分析 那many-to-many节点是什么意思呢
这里指定的是,告诉hibernate现在要查这个中间表的下一个表的条件 class是告诉现在还可以查的是什么表 
class="Student" 哈哈,原来啊,这个set存放的Student这个实体啊 那要查这个Student实体的数据,该怎么查呢 
现在不是又告诉你条件了吗?看column告诉你条件是student_id就可以查Student的数据,指定这个column就是告诉
hibernate这个中间表的字段student_id是引用Student实体的id作为外键而存放的 到这步,数据不全都出来了吗 
小结:发现这个set指定的都是teacher_student的字段 指定的两个列都是作为查询条件而存在的 现在理解了吧!并且在
注意哦!这里指定的一切列名都不在设计的实体哦 





Student类

package hibernate.many;

import java.util.Set;

public class Student {
   private int id;
   private String name;
   private Set<Teacher> teacher;
   
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}

public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}

public Set<Teacher> getTeacher() {
	return teacher;
}
public void setTeacher(Set<Teacher> teacher) {
	this.teacher = 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 
	package="hibernate.many">

	<class name="Student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		
		<set name="teacher" table="teacher_student">
		<key column="student_id"/>
		  <many-to-many class="Teacher" column="teacher_id"/>
		</set>
	</class>
	
</hibernate-mapping>

分析,这里可以按照上面的那种分析原理便可



测试
package hibernate.test;


import java.util.HashSet;
import java.util.Set;

import hibernate.many.Student;
import hibernate.many.Teacher;
import hibernate.util.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.jboss.util.HashCode;

public class ManyToMany {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		add();
		query(1);
	}
	  static void add(){
		   Session session=null;
		   Transaction tx=null;
		   try{
			   session=HibernateUtil.getSession();
			   tx=session.beginTransaction();
			   
			   Set<Teacher> t=new HashSet<Teacher>();
			   Teacher t1=new Teacher();
			   t1.setName("曾笑先老师");
			   t.add(t1);
			   
			   Teacher t2=new Teacher();
			   t2.setName("莫如非老师");
			   t.add(t2);
			   
			   Set<Student> s=new HashSet<Student>();
			   Student s1=new Student();
			   s1.setName("潘长江学生");
			   s.add(s1);
			   
			   Student s2=new Student();
			   s2.setName("如烟学生");
	           s.add(s2);
	           
	           t1.setStudents(s);
	           t2.setStudents(s);
	           
			  // s1.setTeacher(t);
			  // s2.setTeacher(t);
	
			   
			   session.save(t1);
			   session.save(t2);
			   session.save(s1);
			   session.save(s2);
			   tx.commit();
			
		   }finally{
			   if(session!=null) session.close();
		   }
	   }
	   
	   static void query(int id){
		   Session session=null; 
		   try{
			   session=HibernateUtil.getSession();
			   Teacher t=(Teacher)session.get(Teacher.class, 1);
			   System.out.println(t.getName()+"-------->"+t.getStudents().size());
		   }finally{
			   if(session!=null) session.close();
		   }
	   }
}



分析:s1.setTeacher(t);s2.setTeacher(t); t1.setStudents(s); t2.setStudents(s);为什么不能都执行呢?
这跟中建表teacher_student的表结构有关 表结构的主键是以Teacher的id和Student的id组合键作为id的,
如果都执行就会出现主键重复异常的信息 现在来看ddl语句  
CREATE TABLE `teacher_student` (
  `student_id` int(11) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY  (`teacher_id`,`student_id`),
  KEY `FK2E2EF2DE28DF55E7` (`teacher_id`),
  KEY `FK2E2EF2DE18440B47` (`student_id`),
  CONSTRAINT `FK2E2EF2DE18440B47` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`),
  CONSTRAINT `FK2E2EF2DE28DF55E7` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

现在就知道了吧 当你执行完s1.setTeacher(t);s2.setTeacher(t);后,如果再次t1.setStudents(s); t2.setStudents(s);
执行,hibernate接受的teacher的id和Student的id其实跟前两句是一样的,组合成的主键也是一样的 ,这不就违反主键约束了吗


总结:这种多对多或者一对多在程序的性能上是比较低的,在使用的时候,要特别注意,我们可以去使用单向的一对多或者多对多
多对多查询一条数据 往往查询的是两张表,这在应用中其实是比较少的,如果数据量特别庞大,会出现很严重的问题
尽量要用单向的多对多或者一对多,单向的一对一,只需在映射文件中配置一方即可,配置哪一方只需考虑其对应的一方的数据量

完毕 end!

 

分享到:
评论

相关推荐

    VBaccess学生信息管理系统

    &lt;br&gt;&lt;br&gt;目 录&lt;br&gt;摘要 1&lt;br&gt;ABSTRACT 2&lt;br&gt;前言 1&lt;br&gt;第一章 系统概述 2&lt;br&gt;1.1 系统介绍 2&lt;br&gt;1.2 课题目的及意义 2&lt;br&gt;1.3 主要设计功能 3&lt;br&gt;第二章 开发方法的选择 4&lt;br&gt;2.1 开发工具的选择 4&lt;br&gt;2.2 WINDOWS下...

    西电计科大三上数据库系统概论代码合集

    &lt;1&gt;建库时应录入一定数量的(不能过少)学生、教师、课程、成绩等基本信息 &lt;2&gt;录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息 &lt;3&gt;按学号、姓名、专业三种方式查询学生基本信息 &lt;4&gt;录入一位学生一门...

    基于Java开发的仓库管理系统源码+sql数据库+项目说明(毕设项目).zip

    2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...

    图书馆管理系统

    了解书籍的信息&lt;br&gt;&lt;br&gt;&lt;br&gt;关键词:Visual Basic6.0 ACCESS数据库 DAO数据访问对象&lt;br&gt;&lt;br&gt; &lt;br&gt;目 录&lt;br&gt;&lt;br&gt;摘 要 I&lt;br&gt;第1章 概 述 1&lt;br&gt;1.1 开发背景 1&lt;br&gt;1.2 系统的功能 1&lt;br&gt;1.3本文所做的工作 2&lt;br&gt;第2章 ...

    基于ROS的手眼标定程序包源码(c和c++)+项目使用说明.zip

    2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...

    10 映射-- 多对多(老师与学生)

    NULL 博文链接:https://elf8848.iteye.com/blog/341031

    E-R图及关系模型转换2

    假设每个学生选修若干门课程,且每个学生每选一门课只有一个成绩,每个教师只担任一门课的教学,一门课由若干教师任教。“学生”有属性:学号、姓名、地址、年龄、性别。“教师”有属性:职工号、教师姓名、职称,...

    教师-学生-课程.uml

    在线网课系统ER图,用于开发在线网课系统的ER图。方便学习者了解在线网课系统的基本组成和大致结构。对于初学者有很大的帮助。本图使用UML语言画出的用例图。

    E-R图练习例子

    E-R图练习,假设一个学生可选多门课程,而一门课程又有多个学生选修,一个教师可讲多门课程,一门课程至多只有一个教师讲授,试画出E-R图。 学生:学号、专业、姓名 教师:教师号、姓名、职称 课程:课程号、课程名、...

    学生与教师的继承关系类

    学生与教师的继承关系类,很多属性,很实用的

    基于Neo4j,机器学习和Gradio的知识图谱问答机器人

    &lt;项目介绍&gt; 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...

    Python-电商行业知识图谱:构建电商行业实体关系,应用于商品推荐,商品搭配,问答系统+源代码

    &lt;项目介绍&gt; - 商行业知识图谱:构建电商行业实体关系,应用于商品推荐,商品搭配,问答系统 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,...

    基于序列的miRNA和gene的关系预测+源代码+文档说明

    &lt;项目介绍&gt; 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...

    论文研究 - 中四学生使用ICT的态度,态度,行为和对成就的兴趣之间的关系

    该研究旨在检验四名学生中ICT的使用,态度,行为和对化学成就的兴趣之间的关系。 这项研究将帮助他们了解学习者的一些内在因素,因为他们在帮助学习者发展积极态度方面取得了成就,这是在该学科中更好地学习和提高...

    数据库范式设计实验报告.doc

    设u={Sno,Tno ,Cno},Sno代表学生的学号,Tno代表教师的工号,Cno代表课程号,一个老师 只教授一门课,但一门课可以由多个教师来上,一个学生选定一门课,那么就对 应一个固定的老师。即(Sno,Cno)-&gt;Tno,Tno-...

    基于FP-Growths算法的购物车商品关联关系挖掘源码.zip

    2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设...

    论文研究 - 体育课中大学生对体育态度的认知方面与其社交技巧的关系研究

    本研究旨在探讨大学生对体育的态度(PE)的认知方面与他们在体育课中的社交技能之间的关系。 在中国,对573名一年级学生(男269名,女304名,平均年龄= 17.6岁)进行了抽样调查,调查了他们在当前体育课中的社交行为...

    论文研究 - 探索体育课中教师社交行为对学生社交技能的影响-以中国大学新生为例

    本研究通过对中国大学新生的抽样调查,探讨了体育教师的社会行为对体育课学生社交能力的影响。 首先,我们制定了一个量表来确定教师在体育课中所采取的社交行为。 该量表的项目是从教师社交技能自我报告量表的前期...

    JSP_SSM健身俱乐部客户关系管理系统+源代码+文档说明+数据库.zip

    2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...

    论文研究 - 教师准备中的协作责任:赞比亚学生教师对学校在其专业发展中的作用的看法

    这项研究的目的是检验学生教师对学校是否在其专业发展中发挥重要作用的看法。 该研究采用了混合方法设计。 使用开放式和封闭式问卷... 建议教师教育机构与学校建立合作关系,以帮助学生从对教学实践的相互理解中受益。

Global site tag (gtag.js) - Google Analytics