- 浏览: 148226 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
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 715不适合OLAP以查询分析数据为主的系统。适合OLTP联机事务处 ... -
二十五 SQL和命名查询
2011-07-04 19:17 1034SQL和命名查询 SQL查询 //根据sql语句查询 s ... -
二十四 拦截器与监听器
2011-07-04 19:14 947在保存 更新等操作的前 ... -
二十三 iterate查询与N+1次查询的问题
2011-07-04 19:13 771test.java view plaincopy to ... -
二十二 Hibernate映射文件配置
2011-07-04 19:12 875id 主键生成方式 incremen ... -
二十一 串讲Hibernate配置文件中的配置项
2011-07-04 19:11 862数据源配置 ## JNDI Datasource ... -
二十 悲观锁和乐观锁
2011-07-04 19:10 715为了避免对对象同步操作时候产生的数据不一致问题,我们对对象采用 ... -
十九 hibernate3之缓存
2011-07-04 19:09 903什么是缓存?现在我们来看一个模拟的缓存操作 模拟一个缓存例子 ... -
十八 一对一对象的懒加载
2011-07-04 17:59 728一对一对象的懒加载,对于主的一方,lazy是无效的,它在访问数 ... -
十七 懒加载
2011-07-04 17:58 723十七 懒加载 什么是hibe ... -
十六 继承映射
2011-07-04 17:56 480第一种 一个员工类它有两个子类,利用hibernate我们把 ... -
十五 cascade 级联操作与inverse表是否放弃维护关联关系
2011-07-04 17:54 848cascade 级联操作字段 Casade用来说明当对主对 ... -
十四 在hibernate中使用集合总结
2011-07-04 17:52 876集合映射(set, list, array,bag, map) ... -
十三 array数组形式的映射
2011-07-04 17:51 829数组其实跟List的集合映射没有多大的差别,当然它不可以使用b ... -
十二 集合映射之Map集合
2011-07-04 17:49 789十二 Map集合映射 Map是以键值对的形式存放数据的 ... -
十一 集合映射 List集合
2011-07-04 17:47 1024十一 集合映射 set的 ... -
十 组件关联
2011-07-04 17:45 690组件关联 什么是组件关联呢?比如说一个用户,它的名称,有一 ... -
八 一对一 用户与身份证的关系
2011-07-04 17:42 859八 一对一 用户与身份证的关系 设计用户实体 主实体 ... -
七 一对多关系 部门与员工的关系
2011-07-04 17:41 1126一对多 部门与员工的关系 相对于部门来说 一对多 根据先前 ... -
六 员工与部门——》多对以关系
2011-07-04 17:37 1017关联关系 多对一关系 员工与部门的关系 从员工角度 是 ...
相关推荐
- **页面数量**:该作业要求包含多个页面,通过相互之间的超链接实现导航,有助于训练学生在多个页面之间建立逻辑关系的能力。 - **交互性**:要求具备一定的JS特效,例如图片轮播等,这些动态效果能够增加用户的...
-- 学生特有的属性 --> </subclass> </hibernate-mapping> ``` 3. 子类`Teacher`的映射: ```xml <hibernate-mapping> <subclass name="com.example.Teacher" extends="com.example.Person" table="TEACHER"> ...
<caption>学生成绩管理</caption> <!-- 查询按钮与表单 --> <form method="post" action=""> <input type="text" name="query" placeholder="请输入查询条件"> <input type="submit" value="查询"> </form> ...
<student_shankar> <has_take_tuples> <take_tuple_id1>, <take_tuple_id2> . <student_shankar> <has_setuples> <setuple_id1>, <setuple_id2> . ``` 8.1 RDF图表示:与RDF三元组类似,但以图形化方式展示这些关系...
在MyBatis中,我们使用`<association>`标签来映射多对一关系,如下所示: ```xml <resultMap id="courseMap" type="Course"> <!-- 其他属性映射... --> <association property="teacher" javaType="Teacher"> ...
在我们的例子中,一个老师可以教多个学生,同时一个学生也可以被多个老师教授,这种关系就体现了多对多的特性。在数据库层面,通常通过中间表来实现这种关系,它包含了两个实体的主键,作为联合主键。 在Hibernate...
<name><age>小泽马老师</name> 18</age> </person> ``` - 一个XML文档只能有一个根标记。例如下面的代码是正确的: ``` <persons> <person> <name>小泽马老师</name> <age>18</age> </person> </persons...
在本例中,我们将使用学生(Student)和教师(Teacher)之间的多对多关系作为示例。一个学生可以有多个教师,而一个教师也可以有多个学生。 数据库设计 首先,我们需要设计数据库表来存储学生和教师之间的多对多...
-- 学生特有的属性 --> </subclass> <subclass name="com.example.Teacher" table="TEACHER"> <discriminator value="T"/> <!-- 教师特有的属性 --> </subclass> </hibernate-mapping> ``` 这里,`abstract=...
正确的顺序是:陈景润敬重老师 -> 老师批评作业 -> 第二天作业端正 -> 数学成就 -> 给老师写信 -> 认为尊敬老师是基本礼貌 -> 登门拜访老师。这个故事强调了陈景润对老师的敬重和他对学术严谨的态度。 3. 肖邦的...
1. XML映射文件:在Hibernate的映射文件中,使用`<set>`或`<list>`标签来表示一对多关系。`<one-to-many>`标签用于定义多的一方如何关联到一的一方。比如,对于老师和学生的关系,学生实体(Student)会有一个`<set>...
- **教务人员模块**:教务人员可对学生、教师和课程的基本信息进行录入、修改和查询。 - **教师选课模块**:教师可以录入自己将要讲授的课程。 - **学生选课模块**:学生可以从已开设的课程列表中进行选课。 - **...
对于一对多关系,通常使用`<association>`或`<collection>`标签来定义。例如,假设我们有一个`Department`类和一个`Employee`类,一个部门可以包含多个员工: ```xml <!-- Department 映射 --> <mapper ...
在iBATIS的映射文件中,我们需要定义一个`<resultMap>`来处理这种继承关系,并使用`<discriminator>`元素来根据`discriminator`列的值决定实例化哪个子类。 `<resultMap>`配置如下: ```xml <resultMap id=...
例如,在学生(Student)和教师(Teacher)的多对多关系中,使用一个中间表(TeacherStudent)来存储关联。如果 Student 的 `inverse="true"`,那么添加一个新的 Student 时,Hibernate 不会在 TeacherStudent 表中...
学生信息表 <-----> 教师信息表 | | | | 成绩信息表 <-----> 课程信息表 数据字典 以下是本系统的数据字典: * 学生信息表: + 学号(主键) + 姓名 + 密码 * 教师信息表: + 工号(主键) + 姓名 + 密码 *...
例如,一个学生可以有多个课程,一个老师可以教多个班级等。这种关系在Java中通常通过ORM(对象关系映射)框架如Hibernate来实现。以下是对这个主题的详细阐述: 首先,我们需要理解一对多关系的基础概念。在数据库...
1. XML映射方式:在Hibernate的XML映射文件中,我们可以使用`<many-to-one>`标签来表示多对一的关联。例如,如果有一个`Student`类和一个`Teacher`类,`Student`可以有多位老师,而`Teacher`只对应一个班级,那么在`...
<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下...