Hibernate多表关系配置——多对多对关系映射
多对多关系:第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。
一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多 多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的
1、实体
1.1 课程实体
package demo.entity;
import java.util.HashSet;
import java.util.Set;
/**
* 课程实体
* @author Don
* @date:日期:2017年4月11日 时间:下午2:25:45*
* @version 1.0
*/
public class Course {
private String id;
private String name;
//课程中包含的学生列表
private Set<Student> stus = new HashSet<>();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStus() {
return stus;
}
public void setStus(Set<Student> stus) {
this.stus = stus;
}
public Course(){}
public Course(String name) {
this.setName(name);
}
}
1.2 学生实体
package demo.entity;
import java.util.HashSet;
import java.util.Set;
/**
* 学生实体
* @author Don
* @date:日期:2017年4月11日 时间:下午2:25:15*
* @version 1.0
*/
public class Student {
private String id;
private String name;
//学生选的课程列表
private Set<Course> cous=new HashSet<>();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Course> getCous() {
return cous;
}
public void setCous(Set<Course> cous) {
this.cous = cous;
}
public Student() {
}
public Student(String name) {
this.setName(name);
}
}
2、关系映射配置
2.1 课程实体映射
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name:实体, table:表名 -->
<class name="demo.entity.Course" table="m2m_1_course">
<!-- name:主键的名字,column:主键数据库表列,identity自增 -->
<id name="Id">
<!-- 生成主键-->
<generator class="uuid"></generator>
</id>
<!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
<property name="name" />
<!-- 使用中间表的数据构建集合 -->
<set name="stus" table="m2m_1_stu_cour" cascade="save-update">
<!-- 中间表中记录当前类的列 -->
<key column="cid"></key>
<many-to-many class="demo.entity.Student" column="stuid"></many-to-many>
</set>
</class>
</hibernate-mapping>
2.2 学生实体映射
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 在这个一对一的关系中,Person可以自己产生主键值 -->
<!-- name:实体, table:表名 -->
<class name="demo.entity.Student" table="m2m_1_student">
<!-- name:主键的名字,column:主键数据库表列,identity自增 -->
<id name="Id">
<!-- Hibernate使用generator类来生成主键 -->
<generator class="uuid" />
</id>
<!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
<property name="name" />
<!-- 使用中间表的数据构建集合 -->
<set name="cous" table="m2m_1_stu_cour" cascade="save-update">
<!-- 中间表中记录当前类的列 -->
<key column="stuid"></key>
<many-to-many class="demo.entity.Course" column="cid"></many-to-many>
</set>
</class>
</hibernate-mapping>
3、测试添加、删除
package demo.test; import org.hibernate.classic.Session; import demo.entity.Course; import demo.entity.Student; import demo.util.HibernateUtil; public class TestSave { public static void main(String[] args) { Student stu1 = new Student("張三"); Student stu2 = new Student("李四"); Student stu3 = new Student("王五"); Course c1 = new Course("C#"); Course c2 = new Course("JAVA"); Course c3 = new Course("PHP"); Course c4 = new Course("Object-C"); //学生添加选课 stu1.getCous().add(c1); stu1.getCous().add(c2); stu2.getCous().add(c2); stu2.getCous().add(c4); stu3.getCous().add(c1); stu3.getCous().add(c2); stu3.getCous().add(c3); stu3.getCous().add(c3); Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); session.save(stu1); session.save(stu2); session.save(stu3); /*再次添加选课*/ //学生记录 Student stu = (Student)session.get(Student.class, "2"); //课程记录 Course course= (Course)session.get(Course.class, "1"); stu.getCous().add(course); session.update(stu); /*删除选课*/ //学生记录 Student stuDelete = (Student)session.get(Student.class, "2"); //课程记录 Course couDelete= (Course)session.get(Course.class, "1"); stuDelete.getCous().remove(couDelete); session.update(stuDelete); //删除学生记录 session.delete(stuDelete); session.getTransaction().commit(); } }
划船不用桨、杨帆不等风、一生全靠浪


浙公网安备 33010602011771号