首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate 多对多 关系的兑现

2012-09-27 
Hibernate 多对多 关系的实现需要两个实体类,student和course ,多对多的关系,?采用三个表来实现,分别是m2m

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

?

热点排行