Hibernate框架中如何将多对多映射转化为多对一映射
来源:互联网 发布:java里解压缩gzip文件 编辑:程序博客网 时间:2024/06/05 07:47
原文网址:http://blog.csdn.net/lian47810925/article/details/5379821
在hibernate映射中,多对多映射是最麻烦,最复杂的映射,通常情况下我们都将其转化为多对一映射来提高效率。本文以老师与课程的对应关系(一个老师可以交多门课程,一门课程可以由多个老师任教)为案例讨论转化的实现:重点考虑其映射文件的配置。
显然以上关系,通过一个中间表(teacher_course),我们可以将其简化成两个多对一得关系:
teacher_course 与teacher 多对一;
teacher_course 与course 多对一;
建立Teacher.java 文件
package cn.csu.domain;/** * @file Teacher.java * @version 1.0 * @since Mar 14, 2010 */public class Teacher {private int id;private String teacherName;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTeacherName() {return teacherName;}public void setTeacherName(String teacherName) {this.teacherName = teacherName;}}
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 package="cn.csu.domain"> <class name="Teacher"> <id name="id"> <generator class="native"/> </id> <property name="teacherName" column="teacher_name"/> </class></hibernate-mapping>
建立Course.java文件
package cn.csu.domain;/** * @file Course.java * @version 1.0 * @since Mar 14, 2010 */public class Course { private int id; private String courseName; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } }
相应Course.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 package="cn.csu.domain"> <class name="Course"> <id name="id"> <generator class="native"/> </id> <property name="courseName" column="course_name"/> </class></hibernate-mapping>
接下来建立一个中间类,取代多对多映射
建立TeacherCourse.java 文件
package cn.csu.domain;/**中间类 * @file TeacherCourse.java * @version 1.0 * @since Mar 14, 2010 */public class TeacherCourse {private int id;private Teacher teacher;private Coursecourse;public int getId() {return id;}public void setId(int id) {this.id = id;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public Course getCourse() {return course;}public void setCourse(Course course) {this.course = course;}}
相应TeacherCourse.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 package="cn.csu.domain"> <class name="TeacherCourse" table="teacher_course"> <id name="id"> <generator class="native"/> </id> <many-to-one name="teacher" column="teacher_id" class="Teacher"/> <many-to-one name="course" column="course_id" class="Course"/> </class></hibernate-mapping>
至此,三者之间的映射关系就建立完成。
可用如下测试类,测试:
建立Many2Many.java文件
package cn.csu.test;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import cn.csu.domain.Course;import cn.csu.domain.Teacher;import cn.csu.domain.TeacherCourse;import cn.csu.util.HibernateUtil;/**多对多关系转化成三个表进行关系映射 * @file Many2Many.java * @version 1.0 * @since Mar 14, 2010 */public class Many2Many {public static void main(String[] args) {create();get();}//多对多关系的插入static void create(){Session s=null;Transaction tx=null;try{s=HibernateUtil.getSession();tx=s.beginTransaction();Teacher t1=new Teacher();t1.setTeacherName("t1");Teacher t2=new Teacher();t2.setTeacherName("t2");Course c1=new Course();c1.setCourseName("c1");Coursec2=new Course();c2.setCourseName("c2");TeacherCourse tc1=new TeacherCourse();tc1.setTeacher(t1);tc1.setCourse(c1);TeacherCourse tc2=new TeacherCourse();tc2.setTeacher(t1);tc2.setCourse(c2);TeacherCourse tc3=new TeacherCourse();tc3.setTeacher(t2);tc3.setCourse(c1);TeacherCourse tc4=new TeacherCourse();tc4.setTeacher(t2);tc4.setCourse(c2);s.save(t1);s.save(t2);s.save(c1);s.save(c2);s.save(tc1);s.save(tc2);s.save(tc3);tx.commit();System.out.println("operate succeed!!!");}catch(Exception e){e.printStackTrace();if(tx!=null){tx.rollback();}}finally{if(s!=null){s.close();}}}//多对多关系的查询,static void get(){ Session s=null;try{s=HibernateUtil.getSession();//先查出对应姓名的老师的id号String hql1="from Teacher where teacherName=:teacherName";Query query1=s.createQuery(hql1);query1.setString("teacherName", "t1");List<Teacher> list1=query1.list();Teacher teacher=list1.get(0);System.out.println("Teacher id:"+teacher.getId());//以该id号查出中间表中相应课程号,从而获得课程名String hql2="from TeacherCourse where teacher=:teacher";Query query2=s.createQuery(hql2);query2.setEntity("teacher", teacher);List<TeacherCourse> list2=query2.list();for(TeacherCourse m:list2){System.out.println("courseName="+ m.getCourse().getCourseName());}}catch(Exception e){e.printStackTrace();}finally{if(s!=null){s.close();}}}}
- Hibernate框架中如何将多对多映射转化为多对一映射
- Hibernate框架中如何将多对多映射转化为多对一映射
- Hibernate框架中如何将多对多映射转化为多对一映射
- Hibernate框架-----多对一映射(三)
- Hibernate关联映射--多对一映射
- hibernate中多对一关系映射
- hibernate中多对一映射查询
- hibernate中多对一映射删除
- hibernate中多对一映射更新
- hibernate多对一映射
- Hibernate 多对一映射
- 【Hibernate】多对一映射
- hibernate多对一映射
- SSH框架之Hibernate的关联映射之一对多、多对一映射
- Hibernate多对多关系映射拆解为两队多对一关系映射
- 【Hibernate框架】关联映射(一对多,多对一)
- Hibernate框架-------多对多映射(五)
- Hibernate框架-多对多映射
- 线段树_POJ2528_解题报告
- 解析器的介绍
- android程序安装后图标不显示
- 十大免费防火墙大盘点
- [转]常见.Net 英文专业词汇
- Hibernate框架中如何将多对多映射转化为多对一映射
- 停下来是为了更好地出发
- 判断任一二叉树,是否为满二叉树.(输出二叉树,节点总数,二叉树深度)
- 动态建立和删除二维数组
- 常见计算机英文专业词汇
- 阅读优秀代码是提高开发人员修为的一种捷径
- 关于VC/MFC中获得argc,argv的问题
- 或许是因为本科不是学cs的HTML5原因
- C/C++ union用法