首页 > 代码库 > hibernate关系映射(多对多)

hibernate关系映射(多对多)

多对多关系(学生Student,课程Course)

学生类的定义以及hbm文件的配置如下

1 public class Student {2     private int id;3     private String name;4     private Set<Course> courses = new HashSet<Course>();5 }
 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6     <class name="com.zlt.hibernatedemo.Student" table="student"> 7         <id name="id" column="id"> 8             <generator class="increment"></generator> 9         </id>10         11         <property name="name" type="java.lang.String">  12             <column name="name" length="50" />  13         </property>14         15         <set name="courses" table="score" cascade="all">16             <key column="studentid"></key>17             <many-to-many class="com.zlt.hibernatedemo.Course" column="courseid"/>18         </set>19     </class>20 21 </hibernate-mapping>

 

课程类的定义以及hbm文件的配置如下

1 public class Course {2     private int id;3     private String courseName;4     private Set<Student> students = new HashSet<Student>();5 }
 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6     <class name="com.zlt.hibernatedemo.Course" table="course"> 7         <id name="id" column="id"> 8             <generator class="increment"></generator> 9         </id>10         11         <property name="courseName"></property>12         13         <set name="students" table="score">14             <key column="courseid"></key>15             <many-to-many class="com.zlt.hibernatedemo.Student" column="studentid"/>16         </set>17         18     </class>19 20 </hibernate-mapping>

 

测试程序

 1 public class HibernateTest { 2     public static void main(String[] args) { 3         Session session = HibernateFactory.currentSession(); 4         Transaction tx = session.beginTransaction(); 5          6          7         Student student1 = new Student(); 8         student1.setName("student1"); 9         10         Student student2 = new Student();11         student2.setName("student2");12         13         Course course1 = new Course();14         course1.setCourseName("course1");15         16         Course course2 = new Course();17         course2.setCourseName("course2");18         19         //由于使用了默认的inverse(false),所以两端都可以维护关联关系20         student1.getCourses().add(course1);21         student1.getCourses().add(course2);22         23 24         session.save(student1);25         //student设置了级联,所以不需要额外的插入course26 //        session.save(course1);27 //        session.save(course2);28         29         tx.commit();30         session.close();31         32     }33 }

 

结果

 

如果多对多辅助表中还有其他的属性,就得把多对多关系拆分成两个一对多关系

学生Student

1 public class Student {2     private int id;3     private String name;4     private Set<Score> courses = new HashSet<Score>();    5 }

 

课程Course

1 public class Course {2     private int id;3     private String courseName;4     private Set<Score> scores = new HashSet<Score>();5 }

 

成绩Score

1 public class Score {2     private int id;3     private Student student;4     private Course course;5     6     //额外的属性7     private int score; 8 }