前言
以下所有描述以选课系统这个案例来说明。在一个选课系统中,基本的对象有课题(Course)、教师(Teacher)和学生(Student)。
一、一对一关联(有共享主键关联和惟一外键关联两种)
1、共享主键关联
比如课题是由教师去任教,没有教师就没有课题,这样课题就可以完全由教师来决定。
Java示例代码如下:
publicclass Course {
private Long id;
private String name;
private Teacher teacher;
// 省略setter和getter 方法
}
publicclass Teacher {
private Long id;
private String name;
private Course course;
// 省略setter和getter 方法
}
配置文件
Teacher.hbm.xml
<!-- cascade="all" 表明对Teacher对象CRUD的操作会级联到Course对象 -->
<one-to-one name="course" class="powerwind.bean.Course"
cascade="all" />
Course.hbm.xml
<!-- id值参照 teacher属性而生成-->
<id name="id" type="java.lang.Long" column="id">
<generator class="foreign">
<param name="property">teacher</param>
</generator>
</id>
<!-- teacher属性参照 -->
<one-to-one name="teacher" class="powerwind.bean.Teacher"
constrained="true" />
2、惟一外键关联
外键关联需要一个定义外键字段,比如在教师表定义一个课题的外键 course_id。
配置文件
Teacher.hbm.xml
<many-to-one name="course" class="powerwind.bean.Course"
column="course_id" cascade="save-update" unique="true"/>
如果同时在Coure.hbm.xml加上如下配置则为双向关联。
<one-to-one name="teacher" class="powerwind.bean.Teacher"
property-ref="course" />
3、第三种
以上两种一对一关联在Hibernate中是比较常用的。但我用另外一种方法实现时,发现也可行。测试了一下,目前没有发现错误。
思想是和唯一外键关联相似,但两个表中都需要一个外键,在配置<one-to-one>的地方用了<many-to-one>,即两边对用了<many-to-one> 。
Course.hbm.xml
<many-to-one name="teacher" class="powerwind.bean.Teacher"
column="teacher_id" unique="true" />
Teacher.hbm.xml
<many-to-one name="course" class="powerwind.bean.Course"
column="course_id" unique="true" />
细看起来,应该是一对多关联的配置,只是两边都设置“一”,欺骗了hibernate。在hibernate文档中有这样一句:
基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。
二、一对多、多对一关联
一对多(多对一)的关联是现在中用得比较多的。现实中,一个教师是可以任教多个课程的,这就是典型的一对多关系。(由于关联是有方向的,一对多和多对一的单向关联是不同的,而双向的时候就一样)
单向关联:
假设我们只需要从课题知道该课题的任教教师是谁?而不需要从教师那里知道该都任教哪些课程。只在Course.hbm.xml中这样设置就可以。
<many-to-one name="teacher" class="powerwind.bean.Teacher"
column="teacher_id" />
如果只需要从教师那里得知他的所有课程,可把原本多对多的关联变成一对多(需要连接表Teacher_ Course)。
Teacher.hbm.xml
<set name="courses" table="teacher_course" cascade="save-update">
<key column="teacher_id"/>
<many-to-many column="course_id"
unique="true" class="powerwind.bean.Course"/>
</set>
unique="true"是它不同于多对多的地方。
双向关联:
双向关联就是在单向的基础上,再配置多一项(向)。
最常用最标准的配置是这种:
Course.hbm.xml
<many-to-one name="teacher" class="powerwind.bean.Teacher"
column="teacher_id" />
Teacher.hbm.xml
<set name="courses" inverse="true">
<key column="course_id" not-null="true" />
<one-to-many class="powerwind.bean.Course" />
</set>
其中inverse="true" 的设置是比较常用的,设置后,当Teacher和Course对象状态均发生变化时,仅参照Course对象状态的变化来更新数据厍。
三、多对多关联
举个单向多对多关联的例子。比如远程教学,教师不知道他的学生有谁谁谁,只知道有很多学生在远程听课;而学生可以知道他的老师有哪些。这样,不就是单向多对多关联吗?实际上,单向的多对多关联是不完整的双向多对多关联。
如果单向,则只要在Student.hbm.xml配置。
<set name="teachers" inverse="true" table="student_teacher">
<key column="student_id" />
<many-to-many column="teacher_id" class="powerwind.bean.Teacher" />
</set>
如果双向,在上面的基础上,还要在Teacher.hbm.xml配置。
<set name="students" table="student_teacher">
<key column="teacher_id" />
<many-to-many column=" student_id" class="powerwind.bean.Student" />
</set>
有时候,连接表还会有其它信息的。比如学生与课程的关系表(stuent_course),里面可以加入学生的考试成绩。这样的话,我们可以把这个连接表定义成这样:
student_coures( id,student_id, course_id, score );
这样,双向多对多关联就变成两个一对多的关联。这种情况下,多对多的双方并没有直接拥有对方的集合引用。这里把student_coures 表对应的实体叫 Score (一时想不出,叫成绩单算了)。
Student.hbm.xml
<set name="scores" inverse="true">
<key column="student_id" />
<one-to-many class="powerwind.bean.Score" />
</set>
Teacher.hbm.xml
<set name="scores" inverse="true">
<key column="teacher_id" />
<one-to-many class="powerwind.bean.Score" />
</set>
Score.hbm.xml
<many-to-one name="teacher" column="teacher_id"
class="powerwind.bean.Teacher" />
<many-to-one name="student" column="student_id"
class="powerwind.bean.Student" />
分享到:
相关推荐
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
Hibernate 关联关系映射分类
hibernate里关联关系映射,各种关系解析,帮助大家搞清楚hibernate的关系映射
Hibernate关联关系映射.CHM Hibernate文档相关
Hibernate关联关系映射实例速查,帮助初学者学习。
Hibernate4中映射关系图解。
hibernate中的关联关系映射ppt!觉得有用的可以下!
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...
hibernate的关联关系映射,所有描述以选课系统这个案例来说明
Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者
Hibernate_关联关系映射配置
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
Hibernate实体关联关系映射--学习总结,让同仁们更好的学习Hiebernate
关于对Hibernate关联映射的一个总结,其中有各种映射的例子,详细用法 等
Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...
Hibernate关联关系练习【全】
该属性与关联关系的维护权相关。 该属性应放在放弃维护权一方。 该属性值为对方的关联属性,表明以后的关联关系将由它来负责。 使用该属性的注解,无需也不能再设置cascade属性。 该属性只可能在双向...
Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚
文件中包含关于hibernate 各个属性的解释