`

hibernate - 多对多关联关系

阅读更多

多对多关联关系:本质上就是两个一对多的关系,

例如:一个学生可以选择多门课程。一门课程可以被很多学生选择。

体现在代码中如下;学生类:

 

Java代码 
  1. <span style="white-space: pre;">  </span>private String id;//学生id  
  2.     private String name;//学生姓名  
  3.     private Set<Course> course;//学生选择的课程集合  
  4.     public String getId() {  
  5.         return id;  
  6.     }  
  7.     public void setId(String id) {  
  8.         this.id = id;  
  9.     }  
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16.     public Set<Course> getCourse() {  
  17.         return course;  
  18.     }  
  19.     public void setCourse(Set<Course> course) {  
  20.         this.course = course;  
  21.     }  
课程类:

 

 

Java代码 
  1. <span style="white-space: pre;">  </span>private String id;//课程id  
  2.     private String name;//课程名称  
  3.     private Set<Student> student;//学生集合  
  4.     public String getId() {  
  5.         return id;  
  6.     }  
  7.     public void setId(String id) {  
  8.         this.id = id;  
  9.     }  
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16.     public Set<Student> getStudent() {  
  17.         return student;  
  18.     }  
  19.     public void setStudent(Set<Student> student) {  
  20.         this.student = student;  
  21.     }  
关键就是两个映射文件了。

 

student.hbm.xml映射文件

 

Java代码 
  1. <span style="white-space: pre;">  </span><class name="com.test.bean1.Student" table="student">  
  2.         <id name="id" column="id" type="string">  
  3.             <generator class="uuid"/>  
  4.         </id>  
  5.         <property name="name" column="name" type="string"/>  
  6.         <set name="course" table="student_course" cascade="save-update" >  
  7.             <key column="student_id"/><!-- 这个student_id是中间关联表的id,根据这个id可以关联到student表 -->  
  8.             <!-- class:表示关联的类型。column:表示根据course_id可以关联到course表 -->  
  9.             <many-to-many class="com.test.bean1.Course" column="course_id" />  
  10.         </set>  
  11.     </class>  
course.hbm.xml映射文件;

 

 

Java代码 
  1. <class name="com.test.bean1.Course" table="course">  
  2.         <id name="id" column="id" type="string">  
  3.             <generator class="uuid"/>  
  4.         </id>  
  5.         <property name="name" column="name" type="string"/>  
  6.         <!-- 这里的配置和上面的一样,有一点就是inverse为true;表示对方维护这种关联关系。为false:表示主动方;由主动方维护这种关联关系 -->  
  7.         <set name="student" table="student_course" cascade="save-update" inverse="true" >  
  8.             <key column="course_id"/>  
  9.             <many-to-many class="com.test.bean1.Student" column="student_id"  />  
  10.         </set>  
  11.     </class>  
最后来个测试吧:

 

 

Java代码 
  1.         Session session=sessionfactory.openSession();  
  2.         Transaction tx=null;  
  3. //      Student student=new Student();  
  4. //      student.setName("zhangsan");  
  5. //      student.setCourse(new HashSet<Course>());  
  6. //        
  7. //      Course course=new Course();  
  8. //      course.setName("英语");  
  9. //      course.setStudent(new HashSet<Student>());  
  10. //      //添加记录  
  11. //      student.getCourse().add(course);  
  12. //      course.getStudent().add(student);  
  13. //        
  14.         try {  
  15.             tx=session.beginTransaction();  
  16.             //查询到张三学生。没用延迟加载。所以把对应的课程表的信息也查出来了。  
  17.             Student student=(Student)session.get(Student.class"4028ab81385bdd9b01385bdd9d030001");  
  18.             //查询到数学这门课程  
  19. //          Course course=(Course)session.get(Course.class, "4028ab81385be0c001385be0c2db0002");  
  20.             //删除信息  
  21. //          student.getCourse().remove(course);  
  22.               
  23.             //已经查询到了张三的信息。和数学课程的信息。所以可以讲数学这门课程让张三选中  
  24. //          student.getCourse().add(course);  
  25. //          course.getStudent().add(student);  
  26.               
  27.             //遍历张三学生的所选课程  
  28.             Set<Course> course=student.getCourse();  
  29.             for(Iterator<Course> iter=course.iterator();iter.hasNext();){  
  30.                 System.out.println(iter.next().getName());  
  31.             }  
  32.             tx.commit();  
  33.         } catch (Exception e) {  
  34.             if(null!=tx)  
  35.                 tx.rollback();  
  36.             e.printStackTrace();  
  37.         }finally{  
  38.             session.close();  
  39.         }  
省略了获取session的代码了。

 

9
10
分享到:
评论
1 楼 youc3576 2012-07-08  
来个完整版的么 哥们

相关推荐

Global site tag (gtag.js) - Google Analytics