多对多其实特别好理解
就是多个对应对个
举个例子
图书以及图书的分类 图书里能够找到很多分类 分类里能够找到很多图书
2、实体类和映射配置
Student持久化类和Student.hbm.xml
//Student实体类
public class Student {
private Integer sid;
private String sname;
//用set集合来保存选的多个课程
private Set<Course> courseSet = new HashSet<Course>();
set、get.....
}
//Student.hbm.xml
<class name="domain.Student" table="student">
<id name="sid" column="sid">
<!-- 主键生成策略 -->
<generator class="increment"></generator>
</id>
<!-- 一些常规属性 -->
<property name="sname"></property>
<!-- 关键的地方就在这里了。一定要搞清楚两个column分别指的是什么意思 脑袋中要有哪个数据库关系图-->
<!--要查询到所有的course,就需要通过连接表,所以申明连接表的名称-->
<set name="courseSet" table="student_course">
<!-- 本实体类在连接表中的外键名称,过程我们上面分析的很清楚了,为什么需要这个呢?让hibernate知道连接表中有一个外键名为s_id的指向本实体类 -->
<key column="s_id"></key>
<!-- 多对多映射关系,映射类和其映射类在连接表中的外键名称 这个的意思跟上面的一样,也是声明让hibernate知道,这样一来,hibernate就知道如何查询了-->
<many-to-many class="domain.Course" column="c_id"></many-to-many>
</set>
</class>
Course和Course.hbm.xml
//Course实体类
public class Course {
private int cid;
private String cname;
private Set<Student> studentSet = new HashSet<Student>();
...
}
//Course.hbm.xml 有了上面的分析,这个就简单了,内容和意义跟上面的一模一样。
<class name="domain.Course" table="course">
<id name="cid" column="cid">
<!-- 主键生成策略 -->
<generator class="increment"></generator>
</id>
<!-- 一些常规属性 -->
<property name="cname"></property>
<set name="studentSet" table="student_course">
<!-- 本类在连接表中外键的名称, -->
<key column="c_id"></key>
<!--多对多映射关系,映射类和其映射类在连接表中的外键名称-->
<many-to-many class="domain.Student" column="s_id"></many-to-many>
</set>
</class>
3、测试类
Course course = new Course();
course.setCname("化学");
Student student = new Student();
student.setSname("qqq");
course.getStudentSet().add(student);
// student.getCourseSet().add(course);
session.save(course);
session.save(student);
按照自己想法来理解就好啦