表的多对多关系及操作
多对多的表关系表达
表:
使用中间表,分别引用两方的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个)
注意: 配置级联删除时,要小心,双方都配置级联删除, 任意删除一条记录, 整个关系链数据都会被删除.
使用中间表,分别引用两方的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.hcx.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.hcx.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.hcx.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.hcx.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.hcx.a_manytomany;
import org.hibernate.Session;
import org.junit.Test;
import com.hcx.domain.Course;
import com.hcx.domain.Student;
import com.hcx.utils.HibernateUtils;
public class Demo {
@Test
//保存学生 => 通过学生保存课程. 由学生维护外键
//Student 的
//inverse = false
//cascade = save-update
//Course
//inverse = true
public 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(); // 游离状态
}
}