- 浏览: 142638 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyingcatjj:
很适合我这种刚接触的
myeclipse xfire 开发webservice实例 -
tangzlboy:
非常好,非常详细,非常中用。
linux入门 -
yzz9i:
楼主说的很是详细。
myeclipse xfire 开发webservice实例 -
zqx888191:
很再理阿!
老程序员的教诲 -
simplecat123:
...
SQLite数据读取
九 多对多关系 学生<--->老师的关系 多对多关系 学生<--->老师的关系 一个学生可以有多个老师 一个老师可以有多个学生 在多对多的关系的表 在操作和性能方面都不太理想,所以多对多的映射使用较少, 实际使用中最好转换成一对多的对象模型;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!
发表评论
-
二十六 Hibernate实践
2011-07-04 19:18 677不适合OLAP以查询分析数据为主的系统。适合OLTP联机事务处 ... -
二十五 SQL和命名查询
2011-07-04 19:17 1001SQL和命名查询 SQL查询 //根据sql语句查询 s ... -
二十四 拦截器与监听器
2011-07-04 19:14 909在保存 更新等操作的前 ... -
二十三 iterate查询与N+1次查询的问题
2011-07-04 19:13 728test.java view plaincopy to ... -
二十二 Hibernate映射文件配置
2011-07-04 19:12 825id 主键生成方式 incremen ... -
二十一 串讲Hibernate配置文件中的配置项
2011-07-04 19:11 835数据源配置 ## JNDI Datasource ... -
二十 悲观锁和乐观锁
2011-07-04 19:10 681为了避免对对象同步操作时候产生的数据不一致问题,我们对对象采用 ... -
十九 hibernate3之缓存
2011-07-04 19:09 866什么是缓存?现在我们来看一个模拟的缓存操作 模拟一个缓存例子 ... -
十八 一对一对象的懒加载
2011-07-04 17:59 699一对一对象的懒加载,对于主的一方,lazy是无效的,它在访问数 ... -
十七 懒加载
2011-07-04 17:58 660十七 懒加载 什么是hibe ... -
十六 继承映射
2011-07-04 17:56 435第一种 一个员工类它有两个子类,利用hibernate我们把 ... -
十五 cascade 级联操作与inverse表是否放弃维护关联关系
2011-07-04 17:54 799cascade 级联操作字段 Casade用来说明当对主对 ... -
十四 在hibernate中使用集合总结
2011-07-04 17:52 842集合映射(set, list, array,bag, map) ... -
十三 array数组形式的映射
2011-07-04 17:51 780数组其实跟List的集合映射没有多大的差别,当然它不可以使用b ... -
十二 集合映射之Map集合
2011-07-04 17:49 735十二 Map集合映射 Map是以键值对的形式存放数据的 ... -
十一 集合映射 List集合
2011-07-04 17:47 991十一 集合映射 set的 ... -
十 组件关联
2011-07-04 17:45 636组件关联 什么是组件关联呢?比如说一个用户,它的名称,有一 ... -
八 一对一 用户与身份证的关系
2011-07-04 17:42 808八 一对一 用户与身份证的关系 设计用户实体 主实体 ... -
七 一对多关系 部门与员工的关系
2011-07-04 17:41 1076一对多 部门与员工的关系 相对于部门来说 一对多 根据先前 ... -
六 员工与部门——》多对以关系
2011-07-04 17:37 970关联关系 多对一关系 员工与部门的关系 从员工角度 是 ...
相关推荐
<br><br>目 录<br>摘要 1<br>ABSTRACT 2<br>前言 1<br>第一章 系统概述 2<br>1.1 系统介绍 2<br>1.2 课题目的及意义 2<br>1.3 主要设计功能 3<br>第二章 开发方法的选择 4<br>2.1 开发工具的选择 4<br>2.2 WINDOWS下...
<1>建库时应录入一定数量的(不能过少)学生、教师、课程、成绩等基本信息 <2>录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息 <3>按学号、姓名、专业三种方式查询学生基本信息 <4>录入一位学生一门...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
了解书籍的信息<br><br><br>关键词:Visual Basic6.0 ACCESS数据库 DAO数据访问对象<br><br> <br>目 录<br><br>摘 要 I<br>第1章 概 述 1<br>1.1 开发背景 1<br>1.2 系统的功能 1<br>1.3本文所做的工作 2<br>第2章 ...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
NULL 博文链接:https://elf8848.iteye.com/blog/341031
假设每个学生选修若干门课程,且每个学生每选一门课只有一个成绩,每个教师只担任一门课的教学,一门课由若干教师任教。“学生”有属性:学号、姓名、地址、年龄、性别。“教师”有属性:职工号、教师姓名、职称,...
在线网课系统ER图,用于开发在线网课系统的ER图。方便学习者了解在线网课系统的基本组成和大致结构。对于初学者有很大的帮助。本图使用UML语言画出的用例图。
E-R图练习,假设一个学生可选多门课程,而一门课程又有多个学生选修,一个教师可讲多门课程,一门课程至多只有一个教师讲授,试画出E-R图。 学生:学号、专业、姓名 教师:教师号、姓名、职称 课程:课程号、课程名、...
学生与教师的继承关系类,很多属性,很实用的
<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...
<项目介绍> - 商行业知识图谱:构建电商行业实体关系,应用于商品推荐,商品搭配,问答系统 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,...
<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...
该研究旨在检验四名学生中ICT的使用,态度,行为和对化学成就的兴趣之间的关系。 这项研究将帮助他们了解学习者的一些内在因素,因为他们在帮助学习者发展积极态度方面取得了成就,这是在该学科中更好地学习和提高...
设u={Sno,Tno ,Cno},Sno代表学生的学号,Tno代表教师的工号,Cno代表课程号,一个老师 只教授一门课,但一门课可以由多个教师来上,一个学生选定一门课,那么就对 应一个固定的老师。即(Sno,Cno)->Tno,Tno-...
2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设...
本研究旨在探讨大学生对体育的态度(PE)的认知方面与他们在体育课中的社交技能之间的关系。 在中国,对573名一年级学生(男269名,女304名,平均年龄= 17.6岁)进行了抽样调查,调查了他们在当前体育课中的社交行为...
本研究通过对中国大学新生的抽样调查,探讨了体育教师的社会行为对体育课学生社交能力的影响。 首先,我们制定了一个量表来确定教师在体育课中所采取的社交行为。 该量表的项目是从教师社交技能自我报告量表的前期...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
这项研究的目的是检验学生教师对学校是否在其专业发展中发挥重要作用的看法。 该研究采用了混合方法设计。 使用开放式和封闭式问卷... 建议教师教育机构与学校建立合作关系,以帮助学生从对教学实践的相互理解中受益。