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 class="sequence">
    <param name="sequence">student_seq</param>
   </generator>
  </id>
  <property name="scode"></property>
  <property name="sname"></property>
  <set name="courses" inverse="true" table="stdcourse" cascade="all">
   <!--指定关联的外键列-->
   <key column="sid"></key>
   <!--用以映射关联类属性-->
   <many-to-many class="Course" 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 class="native"></generator>
  </id>
  <property name="cname"></property>
  <set name="students" inverse="false" table="stdcourse" cascade="all">
   <!--指定关联的外键列-->
   <key column="cid"></key>
   <!--用以映射关联类属性-->
   <many-to-many class="Student" 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();
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值