天天看点

【Hibernate】多对一关联映射一、基本标签:二、多对一关联映射小结:

    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>联合起来使用。

二、多对一关联映射

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

对象模型:

【Hibernate】多对一关联映射一、基本标签:二、多对一关联映射小结:

关系模型:

【Hibernate】多对一关联映射一、基本标签:二、多对一关联映射小结:

(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一端的属性值。

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

继续阅读