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一端的属性值。
这篇博客作为一个基础的总结,欢迎大家补充指正。