public class Student {
private Integer id; //ID,唯一标识
private String studentName; //学生姓名
private Set teachers = new HashSet(); //关系集合
...省略getter、setter以及构造方法
}
public class Teacher {
private Integer id; //ID,唯一标识
private String teacherName; //教师姓名
...省略getter、setter以及构造方法
}
映射文件
Student.hbm.xml:
<?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>
<class name="Student" table="student">
<id name="id" type="int">
<column name="id"/>
<generator class="increment" />
</id>
<property name="studentName" type="string" />
<set name="teachers" table="studentTeacher" lazy="true" cascade="save-update">
<key column="student_id"/>
<many-to-many class="Teacher" column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
说明<set>里的子标签,key标签表明了在studentTeacher表中引用当前类对应表的主键的外键名。换句话说,表明了studentTeacher里哪一列引用了当前类对应表的主键,<many-to-many>标签说明多对多关系的另一方是哪个类,关系表中哪一列引用了另一方的主键。
Teacher.hbm.xml:
<?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>
<class name="Teacher" table="teacher" >
<id name="id" type="int">
<column name="id" />
<generator class="increment"/>
</id>
<property name="teacherName" type="string"/>
</class>
</hibernate-mapping>
双向关联:下面的POJO类都省略了getter和setter以及构造方法
教师POJO类:
public class Teacher {
private int id;
private String teacherName;
private Set students;
}
学生POJO类:
public class Student {
private int id;
private String studentName;
private Set teachers = new HashSet();
}
教师映射文件Teacher.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Teacher" table="teacher" >
<id name="id" type="int">
<column name="id" />
<generator class="increment"/>
</id>
<property name="teacherName" type="string"/>
<set name="students" table="studentTeacher" lazy="true" cascade="save-update">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
</class>
</hibernate-mapping>
学生映射文件Student.hbm.xml
<?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>
<class name="Student" table="student">
<id name="id" type="int">
<column name="id" />
<generator class="increment" />
</id>
<property name="studentName" type="string" />
<set name="teachers" table="studentTeacher" lazy="true" cascade="save-update" inverse="true">
<key column="student_id" />
<many-to-many class="Teacher" column="teacher_id" />
</set>
</class>
</hibernate-mapping>
多对多使用中间POJO类的方法:
这里只介绍双向关联的映射方法,太饿了。老婆还没回来。没心思写了
中间POJO类:StudentTeacher类
public class StudentTeacher {
private Integer id;
private Teacher teacher;
private Student student;
private int score;
...省略了getter、setter以及构造方法
}
这时Teacher和Student的pojo类内的集合里应该放置这个中间类对象的集合了
public class Teacher {
private Integer id;
private String teacherName;
private Set studentTeachers = new HashSet();
...省略了getter、setter以及构造方法
}
public class Student {
private Integer id;
private String studentName;
private Set studentTeachers = new HashSet();
...省略了getter、setter以及构造方法
}
下面是他们的映射文件,其实就是2个双向的1对多。前面那篇文章已经说过了
Student.hbm.xml:
<?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>
<class name="Student" table="student">
<id name="id" type="int">
<column name="id" />
<generator class="increment" />
</id>
<property name="studentName" type="string" />
<set name="studentTeachers" lazy="true" inverse="true" cascade="save-update">
<key column="student_id" />
<one-to-many class="StudentTeacher" />
</set>
</class>
</hibernate-mapping>
Teacher.hbm.xml
<?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>
<class name="Teacher" table="teacher">
<id name="id" type="int">
<column name="id" />
<generator class="increment" />
</id>
<property name="teacherName" type="string" />
<set name="studentTeachers" lazy="true" inverse="true" cascade="save-update">
<key column="teacher_id" />
<one-to-many class="StudentTeacher" />
</set>
</class>
</hibernate-mapping>
StudentTeacher.hbm.xml:
<?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>
<class name="StudentTeacher" table="studentTeacher">
<id name="id" type="int">
<column name="id" />
<generator class="increment" />
</id>
<property name="score" column="score" type="int" />
<many-to-one name="student" column="student_id" class="Student" not-null="true" />
<many-to-one name="teacher" column="teacher_id" class="Teacher" not-null="true" />
</class>
</hibernate-mapping>