Hibernate框架中如何将多对多映射转化为多对一映射

来源:互联网 发布:淘宝收货人姓名搞笑 编辑:程序博客网 时间:2024/06/06 12:44

 在hibernate映射中,多对多映射是最麻烦,最复杂的映射,通常情况下我们都将其转化为多对一映射来提高效率。

      本文以老师与课程的对应关系(一个老师可以交多门课程,一门课程可以由多个老师任教)为案例讨论转化的实现:重点考虑其映射文件的配置。

      显然以上关系,通过一个中间表(teacher_course),我们可以将其简化成两个多对一得关系:

      teacher_course 与teacher 多对一;

      teacher_course 与course 多对一;

      建立Teacher.java 文件

 

[java] view plaincopy
  1. package cn.csu.domain;  
  2.   
  3. /** 
  4.  * @file Teacher.java 
  5.  * @version 1.0 
  6.  * @since Mar 14, 2010 
  7.  */  
  8. public class Teacher {  
  9.     private int id;  
  10.     private String teacherName;  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getTeacherName() {  
  18.         return teacherName;  
  19.     }  
  20.     public void setTeacherName(String teacherName) {  
  21.         this.teacherName = teacherName;  
  22.     }  
  23.       
  24. }  

Teacher.hbm.xml 文件

[xhtml] view plaincopy
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping package="cn.csu.domain">  
  7.     <class name="Teacher">  
  8.         <id name="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="teacherName" column="teacher_name"/>            
  12.     </class>  
  13. </hibernate-mapping>  

建立Course.java文件

 

[java] view plaincopy
  1. package cn.csu.domain;  
  2.   
  3. /** 
  4.  * @file Course.java 
  5.  * @version 1.0 
  6.  * @since Mar 14, 2010 
  7.  */  
  8. public class Course {  
  9.     private int id;  
  10.     private String courseName;  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getCourseName() {  
  18.         return courseName;  
  19.     }  
  20.     public void setCourseName(String courseName) {  
  21.         this.courseName = courseName;  
  22.     }  
  23.       
  24. }  

相应Course.hbm.xml

 

[xhtml] view plaincopy
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping package="cn.csu.domain">  
  7.     <class name="Course">  
  8.         <id name="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="courseName" column="course_name"/>            
  12.     </class>  
  13. </hibernate-mapping>  

接下来建立一个中间类,取代多对多映射

建立TeacherCourse.java 文件

[java] view plaincopy
  1. package cn.csu.domain;  
  2.   
  3. /**中间类 
  4.  * @file TeacherCourse.java 
  5.  * @version 1.0 
  6.  * @since Mar 14, 2010 
  7.  */  
  8. public class TeacherCourse {  
  9.     private int id;  
  10.     private Teacher teacher;  
  11.     private Course  course;  
  12.     public int getId() {  
  13.         return id;  
  14.     }  
  15.     public void setId(int id) {  
  16.         this.id = id;  
  17.     }  
  18.     public Teacher getTeacher() {  
  19.         return teacher;  
  20.     }  
  21.     public void setTeacher(Teacher teacher) {  
  22.         this.teacher = teacher;  
  23.     }  
  24.     public Course getCourse() {  
  25.         return course;  
  26.     }  
  27.     public void setCourse(Course course) {  
  28.         this.course = course;  
  29.     }  
  30. }  

相应TeacherCourse.hbm.xml

[xhtml] view plaincopy
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping package="cn.csu.domain">  
  7.     <class name="TeacherCourse" table="teacher_course">  
  8.         <id name="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <many-to-one name="teacher" column="teacher_id" class="Teacher"/>  
  12.         <many-to-one name="course" column="course_id" class="Course"/>         
  13.     </class>  
  14. </hibernate-mapping>  

至此,三者之间的映射关系就建立完成。

可用如下测试类,测试:

建立Many2Many.java文件

[java] view plaincopy
  1. package cn.csu.test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.hibernate.Query;  
  6. import org.hibernate.Session;  
  7. import org.hibernate.Transaction;  
  8.   
  9. import cn.csu.domain.Course;  
  10. import cn.csu.domain.Teacher;  
  11. import cn.csu.domain.TeacherCourse;  
  12. import cn.csu.util.HibernateUtil;  
  13.   
  14. /**多对多关系转化成三个表进行关系映射 
  15.  * @file Many2Many.java 
  16.  * @version 1.0 
  17.  * @since Mar 14, 2010 
  18.  */  
  19. public class Many2Many {  
  20.   
  21.     public static void main(String[] args) {  
  22.         create();  
  23.         get();  
  24.     }  
  25.       
  26.     //多对多关系的插入  
  27.     static void create(){  
  28.         Session s=null;  
  29.         Transaction tx=null;  
  30.         try{              
  31.             s=HibernateUtil.getSession();  
  32.             tx=s.beginTransaction();  
  33.               
  34.             Teacher t1=new Teacher();  
  35.             t1.setTeacherName("t1");  
  36.               
  37.             Teacher t2=new Teacher();  
  38.             t2.setTeacherName("t2");  
  39.   
  40.             Course c1=new Course();  
  41.             c1.setCourseName("c1");  
  42.               
  43.             Course  c2=new Course();  
  44.             c2.setCourseName("c2");  
  45.               
  46.             TeacherCourse tc1=new TeacherCourse();  
  47.             tc1.setTeacher(t1);  
  48.             tc1.setCourse(c1);  
  49.               
  50.             TeacherCourse tc2=new TeacherCourse();  
  51.             tc2.setTeacher(t1);  
  52.             tc2.setCourse(c2);  
  53.               
  54.             TeacherCourse tc3=new TeacherCourse();  
  55.             tc3.setTeacher(t2);  
  56.             tc3.setCourse(c1);  
  57.               
  58.             TeacherCourse tc4=new TeacherCourse();  
  59.             tc4.setTeacher(t2);  
  60.             tc4.setCourse(c2);  
  61.               
  62.             s.save(t1);  
  63.             s.save(t2);  
  64.             s.save(c1);  
  65.             s.save(c2);  
  66.               
  67.             s.save(tc1);  
  68.             s.save(tc2);  
  69.             s.save(tc3);  
  70.             tx.commit();              
  71.             System.out.println("operate succeed!!!");  
  72.         }catch(Exception e){  
  73.             e.printStackTrace();  
  74.             if(tx!=null){  
  75.                 tx.rollback();  
  76.             }  
  77.         }finally{  
  78.             if(s!=null){  
  79.                 s.close();  
  80.             }  
  81.         }  
  82.     }  
  83.       
  84.     //多对多关系的查询,  
  85.     static void get(){   
  86.         Session s=null;  
  87.         try{  
  88.             s=HibernateUtil.getSession();  
  89.             //先查出对应姓名的老师的id号  
  90.             String hql1="from Teacher where teacherName=:teacherName";  
  91.             Query query1=s.createQuery(hql1);  
  92.             query1.setString("teacherName""t1");  
  93.             List<Teacher> list1=query1.list();  
  94.             Teacher teacher=list1.get(0);  
  95.               
  96.             System.out.println("Teacher id:"+teacher.getId());            
  97.               
  98.             //以该id号查出中间表中相应课程号,从而获得课程名  
  99.             String hql2="from TeacherCourse where teacher=:teacher";  
  100.             Query query2=s.createQuery(hql2);  
  101.             query2.setEntity("teacher", teacher);             
  102.             List<TeacherCourse> list2=query2.list();  
  103.             for(TeacherCourse m:list2){  
  104.                 System.out.println("courseName="+  
  105.                                                     m.getCourse().getCourseName());  
  106.             }  
  107.         }catch(Exception e){  
  108.             e.printStackTrace();  
  109.         }finally{  
  110.             if(s!=null){  
  111.                 s.close();  
  112.             }  
  113.         }  
  114.     }  

0 0