Hibernate 关联映射 多对多
2011-12-09 15:46
211 查看
Hibernate 关联映射 多对多
多对多
多对多(teacher - student)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
<set name="teacher" table="teacher_student">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
单向多对多
大学生和课程之间的关联就是多对多关联。
对应的持久化代码:
1)Course类
/**课程实体类*/
public class Course{
private Long id;//对象标示符
private String name;//姓名
private Double creditHours;//课时数
public Course(){}//无参构造方法
//以下为所有属性的getter和setter方法….
}
2)Student类
/**学生实体类*/
public class Student{
private long id ;//对象标示符
private String name;//姓名
private String grade;//所在班级
private Set<Course>coursep;//所有所选课程的集合
public Student(){}//无参构造方法
//以下为所有属性的getter和setter方法
}
在关系模型中,是无法直接表达两个表之间的多对多的关联的。需要有一个中间的连接表,在连接表中用外键关联到两个表中。
上面两个持久化类的映射文件如下。
Course.hbm.xml
<?xml version=”1.0” encoding=”UTF-8”>
<!DOCTYPE hibernate-mapping PUBLIC
“-//Hibernate/Hibernate Mapping DTD 3.0//EN”
http://hibernate.sourceforge.net//hibernate-mapping-3.0.dtd>
</hibernate-mapping>
<!—映射持久化类-->
<class name=”com.qiujy.domain.Course” table=”course”>
<!—映射对象标示符-->
<id name=”id” column=”id” type=”long”><generator class=”native”/></id>
<!--映射普通属性-->
<prooerty name=”name”/>
<property name=”creditHours” column=”credit_Hours”/>
</class>
</hibernate-mapping>
Student.hbm.xml
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE hibernate-mapping PUBLIC
“-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”
>
<hibernate-mapping>
<!--持久化类-->
<class name=”com.qiujy.domian.Student” table=”student”>
< --映射标示符 -- >
<id name=”id” column=”id” type=”long”><generator class=”native”/></id>
< -- 映射普通属性 -- >
<property name=”name”/>
<property name=”grade”/>
<! –映射集合属性,指定连接表 -- >
<set name=”course” table=”student_course”>
< --用key元素指定本持久类在连接表中的外键名 -- >
<key column=”student_id”/>
<! – 映射多对多关联 -- >
<many-to-many column=”course_id” class=”com.qiujy.domain.Course”/>
</set>
</class>
</hibernate-mapping>
在Student.hbm.xml类中用set映射了集合属性course,同时指定了中间的连接表是student_course表,指定了在连接表中Student的外键名实student_id,关联的是Course在连接表中的外建明是course_id。
双向多对多
对应的持久化类
/**学生实体类*/
pblic class Student{
private long id;//对象标示符
private String name;//姓名
private String grade;//所属班级
private Set<Course> course;//所有所选课程的集合
public Student(){}//无参构造方法
//以下为所有属性的getter和setter方法…..
}
Course类
/**课程实体类*/
public class Course{
private long id/对象标示符
private String name;//课程名
private Double creditHours;//课时数
Private Set<Student> students;//选择了这门课程的学生的集合
Public Course(){}//无参构造方法
//所有属性的getter和setter方法
}
这两个持久化类的映射文件
Student.hbm.xml
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE hibernate-mapping PUBLIC
“-//Hibernate//Hibernate Mapping DTD 3.0//EN”
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd>
<hibernate-mapping>
< ! – 持久化映射类 -- >
<class name=”com.qiujy.domain.Student” table=”student”>
<! --- 映射对象标示符 --- >
<id name=”id” column=”id” type=”long”><generator class=”native”/></id>
<! ---映射普通属性 -- >
<property name=”name”/>
<property name=”grade”/>
<!—映射集合属性,指定连接表 -- >
<set name=”course” table=”student_course”>
<! – 用key元素指定持久化类在连接表中的外键字段名 -- >
<key column=”student_id”/>
<!-- 映射多对多关联类 à
<many-to-many column=”course_id” class=”com.qiujy.domain.Course”/>
</set>
</class>
</hibernate-mapping>
Course.hbm.xml
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE hibernate-mapping PUBLIC
“-//Hibernate/Hibernate Mapping DTD 3.0//EN”
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd>
<hibernate-mapping>
<!—映射持久化类 -- >
<class name=”com.qiujy.domain.Course” table=”course”>
<! – 映射对象标示符 -- >
<id name=”id” column=”id” type=”long”><generator class=”native”/></id>
<! --映射普通属性 -->
<property name=”name”/>
<property name=”creditHours” column=”credit_hours”/>
<!—映射集合属性,指定连接表 -- >
<set name=”student” table=”student_course” inverse=”ture”>
<! --用key元素指定持久化类在连接表中的外键字段名 -- >
<key column=”corse_id”/>
<!—映射多对多关联 -- >
<many-to-many column=”student-id” class=”com.qiujy.domain.Student”/>
</set>
</class>
</hibernate-mapping>
在双向多对多映射中,最好要在某一端的集合属性映射上设置inverse=”ture”,这样明确地告诉Hibernate,让另一端负责连接表的更新。这样会有更好地性能。
相关文章推荐
- Hibernate的关联映射(5)-双向1-N关联
- Hibernate高级实体关联映射之多值的实体关联(多对多关联的两种思路之一)
- spring+hibernate 关联映射
- hibernate-关系映射(一对多单向关联)-9
- Hibernate之一对多关联映射
- Hibernate关系映射(1)_一对一单向外键关联
- Hibernate映射详解(三)--一对一主键关联映射
- Hibernate关联映射
- Hibernate 关联映射之---- 一对一双向映射
- hibernate之多对一关联映射
- hibernate关联映射与集合映射详解
- hibernate多对一关联映射
- Hibernate读书笔记-----Hibernate的关联映射之组件属性关联关系
- 【HIbernate】(五)关联映射之多对一映射
- hibernate 对象关联,映射非主键字段
- hibernate关联映射
- Hibernate关联映射 --- 一对多实例分析(双向关联)
- Hibernate 关联映射
- Hibernate读书笔记-----Hibernate的关联映射之N-1关联映射
- 一口一口吃掉Hibernate(五)——一对多单向关联映射