Hibernate映射关系之多对多关系映射

来源:互联网 发布:软件学校咨询电话 编辑:程序博客网 时间:2024/05/22 15:03
多对多在大多数应用中还是以一张中间表,以及其pojo类拆分成两个1对多来解决.但是偶尔也会使用中间表并不使用中间表的pojo进行多对多的映射
还是以Student和Teacher两个类做例子.
先介绍下多对多不使用中间POJO类的方法:
单向关联:

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>

原创粉丝点击