需要两个实体类,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();
}