天天看點

【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一端的屬性值。

    這篇部落格作為一個基礎的總結,歡迎大家補充指正。

繼續閱讀