(九)Hibernate的多对多关联关系
一、概述
多对多关联关系在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 里面的数据也相互对应。