一、概述
多对多关联关系在java对象中可以通过定义集合类型来实现关联关系。 在关系数据模型中,无法直接表达表和表之间的多对多关联关系,而是需要创建一个中间表包含了两边的主键,来表达两张表的多对多关联关系。
实例:我们用一个Student和Course(学生和课程)的例子来演示多对多关联关系。
(1)创建Student和Course类
??public class Student { ???????????private Integer id; ???????????private String name; ????????????//用一个集合包含该学生所选的课程对象 ???????????private Set<Course> courses=new HashSet<Course>(); ???????????public Integer getId() { ???????????????return id; ???????????} ???????????public void setId(Integer id) { ???????????????this.id = id; ???????????} ???????????public String getName() { ???????????????return name; ???????????} ???????????public void setName(String name) { ???????????????this.name = name; ???????????} ???????????public Set<Course> getCourses() { ???????????????return courses; ???????????} ???????????public void setCourses(Set<Course> courses) { ???????????????this.courses = courses; ???????????} ???????}
public class Course { ???????????????????private Integer id; ???????????????????private String name; ????????????????????//用一个集合包含所有选择该课程的学生 ???????????????????private Set<Student> students=new HashSet<Student>(); ???????????????????public Integer getId() { ???????????????????????return id; ???????????????????} ???????????????????public void setId(Integer id) { ???????????????????????this.id = id; ???????????????????} ???????????????????public String getName() { ???????????????????????return name; ???????????????????} ???????????????????public void setName(String name) { ???????????????????????this.name = name; ???????????????????} ???????????????????public Set<Student> getStudents() { ???????????????????????return students; ???????????????????} ???????????????????public void setStudents(Set<Student> students) { ???????????????????????this.students = students; ???????????????????} ???????????}
(2)编写我们的映射文件
???????<hibernate-mapping > ???????????<class name="com.cad.domain.Course" table="course"> ???????????????<id name="id" column="id"> ???????????????????<generator class="native"></generator> ???????????????</id> ???????????????<property name="name" column="name"></property> ???????????????<!--table属性用来指定生成的中间表的表名称 ?inverse指定关联关系由Student维护--> ???????????????<set name="students" table="student_course" inverse="true"> ???????????????????<key column="cid"></key> ???????????????????<!--<many-to-many>元素中的column属性指定本表通过中间表中的sid外键关联到Student对象--> ???????????????????<many-to-many class="com.cad.domain.Student" column="sid"></many-to-many> ???????????????</set> ???????????</class> ????????</hibernate-mapping>
???????????<hibernate-mapping > ???????????????<class name="com.cad.domain.Student" table="student"> ???????????????????<id name="id" column="id"> ???????????????????????<generator class="native"></generator> ???????????????????</id> ???????????????????<property name="name" column="name"></property> ???????????????????<!-进行级联保存和更新操作--> ???????????????????<set name="courses" table="student_course" cascade="save-update"> ???????????????????????<key column="sid"></key> ???????????????????????<many-to-many class="com.cad.domain.Course" column="cid"></many-to-many> ???????????????????</set> ???????????????</class> ????????????</hibernate-mapping> ?
测试:
???????????public class Demo { ???????????????@Test ???????????????public void fun(){ ???????????????????//读取配置文件 ???????????????????Configuration conf=new Configuration().configure(); ???????????????????//根据配置创建factory ???????????????????SessionFactory sessionfactory=conf.buildSessionFactory(); ???????????????????Session session = sessionfactory.openSession(); ?????????????????????Transaction ts=session.beginTransaction(); ????????????????????//创建两个Student ???????????????????Student s1=new Student(); ???????????????????s1.setName("tom"); ???????????????????Student s2=new Student(); ???????????????????s2.setName("jack"); ???????????????????//创建三个Course ???????????????????Course c1=new Course(); ???????????????????c1.setName("语文"); ???????????????????Course c2=new Course(); ???????????????????c2.setName("数学"); ???????????????????Course c3=new Course(); ???????????????????c3.setName("英语"); ???????????????????//因为设置了关联关系由Student维护,所以不需要课程再来关联Student ???????????????????s1.getCourses().add(c1); ???????????????????s1.getCourses().add(c2); ???????????????????s1.getCourses().add(c3); ????????????????????s2.getCourses().add(c1); ???????????????????s2.getCourses().add(c2); ???????????????????s2.getCourses().add(c3); ???????????????????//由于设置了级联保存,所以只保存Student即可 ???????????????????session.save(s1); ???????????????????session.save(s2); ???????????????????ts.commit(); ???????????????????session.close(); ???????????????????sessionfactory.close(); ???????????????} ???????????} ????结果,数据库中生成了三张表。 ???student和course ???还有中间表student_course ???里面的数据也相互对应。
(九)Hibernate的多对多关联关系
原文地址:https://www.cnblogs.com/yuexiaoyun/p/9452393.html