ORM进阶:映射文件编写(上)-基本映射

来源:互联网 发布:北大医学部知乎 编辑:程序博客网 时间:2024/06/04 05:31


       上一篇文章中提到,使用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>的使用。通过名字很容易就可以想到这些标签。


只有以上关联映射,可以解决很多问题。但是对于需求复杂的,仅仅使用以上几种会有些困难。下篇,我们看一下其他的映射如何编写。

0 0