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>
还是以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>
相关文章推荐
- Hibernate关系映射学习点滴2:一对多和多对多关系映射
- Hibernate关系映射之多对多关系
- hibernate实体关系映射——单边的多对多关系
- Hibernate实体关系映射——双边的多对多关系
- Hibernate注解-多对一关系映射注解,一对多关系映射注解,多对多关系映射注解
- Hibernate之多对多关系之间的关系映射
- Hibernate 基于注解的方式 实现的关系映射案例(一对一关系,一对多关系,多对多关系)
- Hibernate实体关系映射——单边的多对多关系
- hibernate映射继承关系一
- hibernate对象关系映射的配置
- hibernate注解关系映射
- ORM进阶之Hibernate中关系映射
- Hibernate关系映射:单向多对多映射
- 【Hibernate】关系映射
- Hibernate深入理解----06映射继承关系
- Hibernate实体关系映射:双向主键一对一关联
- Hibernate 关系映射
- Hibernate4.2.4入门(二)——一对多的映射关系
- Hibernate的核心对象关系映射
- Hibernate -- 映射组成关系