Hibernate中的表的多对多关系及操作

来源:互联网 发布:散打 知乎 编辑:程序博客网 时间:2024/05/07 17:49

表的多对多关系及操作

多对多的表关系表达


表:
使用中间表,分别引用两方的ID
对象: 
两方都使用集合表达
配置:
<set name="courses" table="t_student_course"  >
<key column="sid" ></key>
<many-to-many class="Course" column="cid" ></many-to-many>
</set>

操作:
inverse: 我是否要放弃维护外键关系
cascade: 是否需要级联操作 (5个)
注意: 配置级联删除时,要小心,双方都配置级联删除, 任意删除一条记录, 整个关系链数据都会被删除.


多对多的对象关系表达

配置:

Student:
package com.itheima.domain;import java.util.HashSet;import java.util.Set;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;}}



Course:
package com.itheima.domain;import java.util.HashSet;import java.util.Set;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;}}



Student.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <!-- ORM元数据  表对象关系映射文件     package : 配置该配置文件中类所在的包.  --> <hibernate-mapping package="com.itheima.domain" > <class name="Student" table="t_student"   ><id name="id" column="id"    ><generator class="native"></generator></id> <property name="name" column="name" ></property><!-- 多对多关系 --><!-- set 表达集合name: 集合的属性名table:多对多中间表的表名key 表达外键column:引用我的外键名many-to-many 表达多对多class : 集合引用方的类型column:对方在中间表的外键名 --><set name="courses" table="t_student_course" inverse="false" cascade="save-update"  ><key column="sid" ></key><many-to-many class="Course" column="cid" ></many-to-many></set> </class> </hibernate-mapping>



Course.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <!-- ORM元数据  表对象关系映射文件     package : 配置该配置文件中类所在的包.  --> <hibernate-mapping package="com.itheima.domain" > <class name="Course" table="t_course"  ><id name="id" column="id"    ><generator class="native"></generator></id> <property name="name" column="name" ></property><set name="students" table="t_student_course" inverse="true" ><key column="cid" ></key><many-to-many class="Student" column="sid"  ></many-to-many></set> </class> </hibernate-mapping>


操作:

package com.itheima.a_manytomany;import org.hibernate.Session;import org.junit.Test;import com.itheima.domain.Course;import com.itheima.domain.Student;import com.itheima.utils.HibernateUtils;public class Demo {@Test//保存学生 => 通过学生保存课程. 由学生维护外键//Student 的//inverse =  false//cascade =  save-update//Course//inverse = truepublic void fun1(){Session session = HibernateUtils.openSession();session.beginTransaction();//------------------------------------------------Student stu1 = new Student();stu1.setName("tom");Student stu2 = new Student();stu2.setName("jerry");Course c1 = new Course();c1.setName("Struts2");Course c2 = new Course();c2.setName("Hibernate");Course c3 = new Course();c3.setName("Spring");stu1.getCourses().add(c1); //维护关系,级联保存stu1.getCourses().add(c2);stu1.getCourses().add(c3);stu2.getCourses().add(c1);stu2.getCourses().add(c2);stu2.getCourses().add(c3);session.save(stu1);session.save(stu2);//------------------------------------------------session.getTransaction().commit();session.close(); // 游离状态}}





0 0
原创粉丝点击