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();}}}}


 


 

原创粉丝点击