上一篇文章中提到,使用Hibernate做OR映射,最主要的就是编写hbm映射文件。即:实体到数据库表的转化关系。
这篇文章将讲述,一些常见映射文件的编写,以及需要注意的地方。
对于关系模型的建立。即实体的映射关系,通过OR映射,将实体关系模型,转换成关系对象模型。
常用的三种映射方式
- 一对一
- 一对多,多对一
- 多对多
对与上面的几种情况。最常用的是多对一关联映射。
ER关系模型中
1、多对多往往是拆分成两个一对多的关系,通过生成一个关系表来处理多对多的关系。
2、一对一的关系,虽然也很常见,比如:人和卡的关系。但是难免需求发生变化,即一个人可以拥有多张卡。此类问题,一对一的关系将变成一对多的关系。
简单来说:一对一关系,是一对多关系的特例。
一对一关联映射
最主要的标签的使用,首先我们先看一下要达到的关系结构:
如上图,将建立一个一对一的关联映射。即person维护card的信息。保持一致性。
person类的映射文件,建立一对一的关系,并维护关系:
<class name="com.demo.hibernate.Person" table="t_person">
<id name="id">
<!-- 该主键采用foreign生成策略,foreign会取得关联对象的表示 -->
<generator class="foreign">
<!-- property只关联对象(使用card的主键) -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!--
one-to-one标签,指示hibernate如何加载其关联对象,默认根据主键加载
也就是拿到关系字段值,根据对端的主键来加载关联对象
constrained="true" 表示,当前主键(person的主键)还是一个外键
参照了对端的主键(IdCard), 也就是会生成外键约束语句
-->
<one-to-one name="idCard" constrained="true"/>
</class>
card类的映射文件
<class name="com.demo.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="CardNo"/>
</class>
多对一关联映射
多对一的关系,维护端在多的一方,而且需要维护的字段也在多的一方,所以配置如下:
<class name="com.demo.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid" cascade="save-update"/>
</class>
<class name="com.demo.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
该种 关系,唯一需要注意的就是,需要在多的维护关系,而且也是多的一端添加一个字段。
所以多对一的关系需要做的是:在多的一端添加标签。
一对多关联映射
对于一对多的关系,需要一的一端来维护关系,即在一中存在一个集合,用于保存多的关系。
即,一的一端hbm为,添加一个用于维护该关系:
<class name="com.demo.hibernate.Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid"></key> <!-- 在student中加入一个外键 -->
<one-to-many class="com.demo.hibernate.Student"></one-to-many>
</set>
</class>
另一端的关系,被一的一端维护,所以多的一端hbm如下:
<class name="com.demo.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="classes" column="classesid"/>
</class>
添加标签,是为了在多的一张表中添加一个字段,用于维护该关系。
多对多关联映射
多对多的关系,即特殊的就是那个关系表。主要是配置关系表。
以下是维护关系一方的hbm文件:
<hibernate-mapping >
<class name="com.demo.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com.demo.hibernate.Role" column="role_id"/>
</set>
</class>
</hibernate-mapping>
被维护方hbm文件:
<class name="com.demo.hibernate.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
总结
<many-to-one>
会在本类生成的表中生成一个字段,用于维护该关系。
<one-to-many>
会在指定类生成的表中生成一个字段,用于维护关系。
<many-to-many>
因为会生成一个不是类的关系表。所以<many-to-many>
需要指定新表的名称,和与本类相关联的字段名。在这个关系中需要注意:多对多关系的 两个类,都要设置 <many-to-many>
关系,而且表名需要一致。
对于以上几种映射,也就几个标签的使用。<one-to-one> <many-to-one> <one-to-many> <many-to-many
>的使用。通过名字很容易就可以想到这些标签。
只有以上关联映射,可以解决很多问题。但是对于需求复杂的,仅仅使用以上几种会有些困难。下篇,我们看一下其他的映射如何编写。