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一端的屬性值。
這篇部落格作為一個基礎的總結,歡迎大家補充指正。