【Hibernate】多对一关联映射

来源:互联网 发布:linux centos官网 编辑:程序博客网 时间:2024/06/01 08:12

    hibernate提供了多种映射机制,创建映射文件要以.hbm.xml为后缀名,在映射文件中注册实体类,将实体类的属性添加到映射文件中,本篇博客介绍多对一关联映射,在介绍多对一关联映射前先简单的说一下映射的基本内容。


一、基本标签:

class标签:

name表示映射实体类,需要把值设置为转化成表的实体类的名称,在同步时会根据该属性查找相应的实体类。

table表示映射数据库的表的名称,如果要映射的表的名称和实体类名称不相同,使用该属性来指定映射的表,如果不存在的话会根据该属性值创建一个表。

id或property标签:

name:功能类似于class标签的name,值定实体类的映射属性名。

column:指定映射表的列名称,如果不存在将会创建。

type:指定映射到数据库中字段的数据类型。

generator:用来为一个持久类生成一个唯一的标识。

其他:

        identity:返回的标识符是long, short 或者int类型的。类似于数据库的自增字段。
        sequence:在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。在整个数据库中自增,而不是单个的表中自增,需要指定单个的表中自增需要添加属性。
        uuid:用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串,类似于.NET时使用的guid。
        native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。灵活的方式,会根据使用的数据库来确定使用的标识类型,MySQL会选择identity,Oracle选择sequence。
        assigned:手动为实体类制定一个标识id。这是 <generator>元素没有指定时的默认生成策略。

        foreign:使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。


二、多对一关联映射

    多对一关系映射的原理就是在多的一端加入一个外键,指向一的一端。就像用户和组之间的关系,一个组中可能有多个用户,多个用户可能属于一个组,我们可以将组号作为外键添加到用户表中,关系如下所示:

对象模型:


关系模型:


(1)直接映射

使用<many-to-one>标签,many指多的一端,one指少的一端,通常在多的一端使用这个标签。

User.hbm.xml中的<many-to-one>,name的值为User表的外键,为user.java中对应的外键属性值。代码如下:

<hibernate-mapping>      <class name="com.hibernate.User" table="t_user">          <id name="id" type="java.lang.Long">              <column name="ID" />              <generator class="assigned" />          </id>                    <!-- name的值group为User.java中的一个对应的one中的一个属性,它会自动在表中生成一列,所以使用column对列进行了重命名 -->          <many-to-one name="group" column="groupid"></many-to-one>                </class>  </hibernate-mapping>
Group.hbm.xml代码:

<hibernate-mapping><class name="com.hibernate.Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"/></class></hibernate-mapping>
User.java类代码,group属性为<many-to-one>的one一端的name值。

package com.bjpowernode.hibernate;public class User {private int id;private String name;private Group group;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}}

(2)级联映射

实现多对一关联映射还可以在<many-to-one>属性中添加cascade属性,赋值为save-update,这样只需要将两个user对象的Group属性设置为同一个group对象即可实现多对一的映射关系。

User.hbm.xml代码如下:

<hibernate-mapping>      <class name="com.hibernate.User" table="t_user">          <id name="id" type="java.lang.Long">              <column name="ID" />              <generator class="assigned" />          </id>                    <!-- 级联修改表 -->          <many-to-one name="group" column="groupid" cascade="save-update"></many-to-one>                </class>  </hibernate-mapping> 

小结:

    第一种实现方式没有采用Hibernate字段的的属性,支持增删改查,第二种级联修改则采用hibernate提供的方法,不支持查询。两种方法都需要讲<many一端的映射文件添加该标签,并将标签的name属性赋值为对应类中one一端的属性值。

    这篇博客作为一个基础的总结,欢迎大家补充指正。

0 0