多对多关联关系:本质上就是两个一对多的关系,
例如:一个学生可以选择多门课程。一门课程可以被很多学生选择。
体现在代码中如下;学生类:
private String id;//学生id private String name;//学生姓名 private Set<Course> course;//学生选择的课程集合 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Course> getCourse() { return course; } public void setCourse(Set<Course> course) { this.course = course; }课程类:
private String id;//课程id private String name;//课程名称 private Set<Student> student;//学生集合 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Student> getStudent() { return student; } public void setStudent(Set<Student> student) { this.student = student; }关键就是两个映射文件了。
student.hbm.xml映射文件
<class name="com.test.bean1.Student" table="student"> <id name="id" column="id" type="string"> <generator class="uuid"/> </id> <property name="name" column="name" type="string"/> <set name="course" table="student_course" cascade="save-update" > <key column="student_id"/><!-- 这个student_id是中间关联表的id,根据这个id可以关联到student表 --> <!-- class:表示关联的类型。column:表示根据course_id可以关联到course表 --> <many-to-many class="com.test.bean1.Course" column="course_id" /> </set> </class>course.hbm.xml映射文件;
<class name="com.test.bean1.Course" table="course"> <id name="id" column="id" type="string"> <generator class="uuid"/> </id> <property name="name" column="name" type="string"/> <!-- 这里的配置和上面的一样,有一点就是inverse为true;表示对方维护这种关联关系。为false:表示主动方;由主动方维护这种关联关系 --> <set name="student" table="student_course" cascade="save-update" inverse="true" > <key column="course_id"/> <many-to-many class="com.test.bean1.Student" column="student_id" /> </set> </class>最后来个测试吧:
Session session=sessionfactory.openSession();
Transaction tx=null;
// Student student=new Student();
// student.setName("zhangsan");
// student.setCourse(new HashSet<Course>());
//
// Course course=new Course();
// course.setName("英语");
// course.setStudent(new HashSet<Student>());
// //添加记录
// student.getCourse().add(course);
// course.getStudent().add(student);
//
try {
tx=session.beginTransaction();
//查询到张三学生。没用延迟加载。所以把对应的课程表的信息也查出来了。
Student student=(Student)session.get(Student.class, "4028ab81385bdd9b01385bdd9d030001");
//查询到数学这门课程
// Course course=(Course)session.get(Course.class, "4028ab81385be0c001385be0c2db0002");
//删除信息
// student.getCourse().remove(course);
//已经查询到了张三的信息。和数学课程的信息。所以可以讲数学这门课程让张三选中
// student.getCourse().add(course);
// course.getStudent().add(student);
//遍历张三学生的所选课程
Set<Course> course=student.getCourse();
for(Iterator<Course> iter=course.iterator();iter.hasNext();){
System.out.println(iter.next().getName());
}
tx.commit();
} catch (Exception e) {
if(null!=tx)
tx.rollback();
e.printStackTrace();
}finally{
session.close();
}省略了获取session的代码了。