Hibernate 映射关系之多对多--(Teacher and Student)
老师与学生属于多对多的关系,1为老师叫多名学生,而一个学生学习多门课程,多门课程一般应该有多个教师教授。
Model class:
package bm.storm.hibernate.domain;
import java.util.Set;
public class Teacher {
private int id;
private String name;
private Set<Student> students;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the students
*/
public Set<Student> getStudents() {
return students;
}
/**
* @param students the students to set
*/
public void setStudents(Set<Student> students) {
this.students = students;
}
}
package bm.storm.hibernate.domain;
import java.util.Set;
public class Student {
private int id;
private String name;
private Set<Teacher> teachers;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the teachers
*/
public Set<Teacher> getTeachers() {
return teachers;
}
/**
* @param teachers the teachers to set
*/
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
mapping file
<?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 package="bm.storm.hibernate.domain">
<class name="Teacher" table="teacher">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" table="teacher_student">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
</class>
</hibernate-mapping>
<?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 package="bm.storm.hibernate.domain">
<class name="Student" table="student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="teachers" table="teacher_student">
<key column="student_id"/>
<many-to-many class="Teacher" column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
DB:
* 在存数据的的时候只能建立单一的关系,不能即指定老师有多少个学生,又指定学生有多少个老师,因为指定关系的时候,会向中间表插入记录,而中间表又是联合主键,在插入时,建立两边的关系,会向中间表插入两条相同记录,导致hibernate会抛出主键重复异常。