Hibernate 多对多 关系的实现
需要两个实体类,student和course ,多对多的关系,
?
采用三个表来实现,分别是m2mstudent 学生表,course 课程表,stdcourse学生课程表
?
实体类(全部省去无参构造和getter\setter)
?
public class Student { private int sid; private int scode; private String sname; private Set<Course> courses;} public class Course { private int cid; private String cname; private Set<Student> students;}?
?
Hibernate映射文件
?
student.hbm.xml
?
<hibernate-mapping package="day4.m2m.entity"> <class name="Student" table="m2mstudent" > <id name="sid" column="sid"> <generator inverse="true" table="stdcourse" cascade="all"> <!--指定关联的外键列--> <key column="sid"></key> <!--用以映射关联类属性--> <many-to-many column="cid"></many-to-many> </set> </class></hibernate-mapping>
??
course.hbm.xml
?
<hibernate-mapping package="day4.m2m.entity"> <class name="Course" table="course"> <id name="cid" column="cid"> <generator inverse="false" table="stdcourse" cascade="all"> <!--指定关联的外键列--> <key column="cid"></key> <!--用以映射关联类属性--> <many-to-many column="sid"></many-to-many> </set> </class></hibernate-mapping>
??
测试代码: 别笑 :-)
public class TestM2M { public static void main(String[] args) { //表控制权位于Course中 Course c1 = new Course(); Course c2 = new Course(); Course c3 = new Course(); Course c4 = new Course(); c1.setCname("语文"); c2.setCname("数学"); c3.setCname("化学"); c4.setCname("生物"); Student s1 = new Student(100,"周哥哥"); Student s2 = new Student(101,"周姑姑"); Student s3 = new Student(102,"周弟弟"); Student s4 = new Student(103,"周妹妹"); Student s5 = new Student(104,"周姐姐"); Student s6 = new Student(105,"周爸爸"); Student s7 = new Student(106,"周妈妈"); Student s8 = new Student(107,"周爷爷"); Student s9 = new Student(108,"周奶奶"); Student s10 = new Student(109,"周舅舅"); Student s11 = new Student(110,"周婶婶"); Student s12 = new Student(111,"周姥姥"); Set<Student> stu_yuwen = new HashSet<Student>(); stu_yuwen.add(s1); stu_yuwen.add(s2); stu_yuwen.add(s3); stu_yuwen.add(s5); Set<Student> stu_shuxue = new HashSet<Student>(); stu_shuxue.add(s2); stu_shuxue.add(s4); stu_shuxue.add(s7); stu_shuxue.add(s9); stu_shuxue.add(s11); Set<Student> stu_huaxue = new HashSet<Student>(); stu_huaxue.add(s1); stu_huaxue.add(s3); stu_huaxue.add(s7); stu_huaxue.add(s9); Set<Student> stu_shengwu = new HashSet<Student>(); stu_shengwu.add(s6); stu_shengwu.add(s8); stu_shengwu.add(s10); stu_shengwu.add(s1); stu_shengwu.add(s2); stu_shengwu.add(s3); c1.setStudents(stu_yuwen); c2.setStudents(stu_shuxue); c3.setStudents(stu_huaxue); c4.setStudents(stu_shengwu); Session ss = DBFactory.getSession(); Transaction ts = ss.beginTransaction(); ss.save(c1); ss.save(c2); ss.save(c3); ss.save(c4); ts.commit(); ss.close(); } }?或许保存Student到数据库更符合人们的习惯
?
只需要将xml文件中的inverse对调,然后更改到如下测试代码
?
public static void main(String[] args) { //表控制权位于Student中 Course c1 = new Course(); Course c2 = new Course(); Course c3 = new Course(); Course c4 = new Course(); Course c5 = new Course(); Course c6 = new Course(); Course c7 = new Course(); Course c8 = new Course(); c1.setCname("语文"); c2.setCname("数学"); c3.setCname("化学"); c4.setCname("生物"); c5.setCname("计算机"); c6.setCname("政治"); c7.setCname("历史"); c8.setCname("物理"); Student s1 = new Student(100,"周哥哥"); Student s2 = new Student(102,"周弟弟"); Student s3 = new Student(103,"周妹妹"); Student s4 = new Student(104,"周姐姐"); Set<Course> set1 = new HashSet<Course>(); set1.add(c1); set1.add(c3); set1.add(c5); set1.add(c4); set1.add(c2); s1.setCourses(set1); Set<Course> set2 = new HashSet<Course>(); set2.add(c1); set2.add(c2); set2.add(c3); s2.setCourses(set2); Set<Course> set3 = new HashSet<Course>(); set3.add(c3); set3.add(c4); set3.add(c5); set3.add(c6); set3.add(c7); s3.setCourses(set3); Set<Course> set4 = new HashSet<Course>(); set4.add(c1); set4.add(c4); set4.add(c5); set4.add(c8); s4.setCourses(set4); Session ss = DBFactory.getSession(); Transaction ts = ss.beginTransaction(); ss.save(s1); ss.save(s2); ss.save(s3); ss.save(s4); ts.commit(); ss.close(); }?