多对多关联关系:本质上就是两个一对多的关系,
例如:一个学生可以选择多门课程。一门课程可以被很多学生选择。
体现在代码中如下;学生类:
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的代码了。