您的位置:首页 > 其它

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

2011-12-20 16:19 344 查看
多对多在大多数应用中还是以一张中间表,以及其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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: