1. 程式人生 > >Hibernate 一對一關聯對映(主鍵關聯VS唯一外來鍵關聯)

Hibernate 一對一關聯對映(主鍵關聯VS唯一外來鍵關聯)

一對一關聯對映有兩種:一種是主鍵關聯,一種是“唯一”外來鍵關聯。 
主鍵關聯:原理是兩張表的主鍵(ID)保持一致,在獲取的時候根據兩種表中的ID相同來作為關係判斷的標準,這樣的設計好處在於我們不用新增另外的欄位來維護它們之間的關係。 
廢話少說,看例子。 
在生活一對一的關係還“算”挺多的,比如人與自己的省份證,丈夫和妻子(當然是在符合中國國情的情況下)等等。 
第一步:建立兩張表。

TABLE:husband 

create table husband(
h_id int primary key,
h_name varchar(20)
);

TABLE:wife 
create table wife(
w_id int primary key,
w_name varchar(20)
);

注意:這兩張表沒有使用外來鍵來關聯它們。
第二步:建立PO物件。
JAVA PO :HusbandPO.java 
package com.lovo.po;
public class HusbandPO {
  private int id;
	
  private String name;
	
  private WifePO myWife; //注意包含了一個妻子物件

  ... other getXX setXX ...
}

JAVA PO :WifePO.java 
package com.lovo.po;
public class WifePO {
  private int id;
	
  private String name;
	
  private HusbandPO myHus; //注意包含了一個丈夫物件

  ... other getXX setXX ...
}

第三步:在XX.hbm.xml中配置PO物件屬性與資料庫表字段的對映。
HusbandPO.hbm.xml 
 <hibernate-mapping>
	<!-- 主控方 -->
	<class name="com.lovo.po.HusbandPO" table="husband">
		<id name="id" column="h_id" type="int">
			<generator class="increment"></generator>
		</id>
		<property name="name" column="h_name" type="string"></property>
		<!-- cascade的作用是當本身發生修改的時候,會級聯的修改從表 -->
		<one-to-one name="myWife" class="com.lovo.po.WifePO" cascade="all"></one-to-one>
	</class>
</hibernate-mapping>

WifePO.hbm.xml 
 <hibernate-mapping>
	<class name="com.lovo.po.WifePO" table="wife" >
		<id name="id" column="w_id" type="int">
			<generator class="foreign">
				<!-- 引用husband表的主鍵 -->
				<param name="property">myHus</param>
			</generator>
		</id>
		<property name="name" column="w_name" type="string"></property>
		<one-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"></one-to-one> 
	</class>
</hibernate-mapping>

唯一外來鍵對映:記住是“唯一”,因為一對一是多對一的一種特例,且在hibernate-mapping中是利用<many-to-one>來表示,這個時候需要指明該標籤的unique="true",這才算是一對一,否則就是多對一。 
例子還是使用上面的一一制夫妻關係。 
第一步:只需要在兩張表的其中一張中加上一個外來鍵,我這裡在wife身上加(沒有別的意思 )。 
TABLE:husband 
create table husband(
h_id int primary key,
h_name varchar(20)
);
TABLE:wife 
create table wife(
w_id int primary key,
w_name varchar(20),
fk_hus_id int foreign key(fk_hus_id) 
references husband(h_id)
);

第二步:上面是寫PO ,這裡也不例外,不過PO物件沒有改變過哈,這裡不復寫了。 
第三步:XX.hbm,xml配置,配置與上面有所區別,注意啦…… 
HusbandPO.hbm.xml 
<hibernate-mapping> 
	<class name="com.lovo.po.HusbandPO" table="husband">
		<id name="id" column="h_id" type="int">
			<generator class="increment"></generator>
		</id>
		<property name="name" column="h_name" type="string"></property> 
		<one-to-one name="myWife" class="com.lovo.po.WifePO"
		property-ref="myHus" cascade="all"></one-to-one>
		<!-- property-ref 被關聯到此外來鍵的類中的對應屬性的名字,若沒指定,使用被關聯類的主鍵.由於這裡是唯一外來鍵關聯,所以一般要設定這裡。(這裡相當於是在說我妻子的老公是我,從而我妻子的結婚證編號和我的結婚證編號是一樣的)  -->
	</class>
</hibernate-mapping>

WifePO.hbm.xml 
<hibernate-mapping>
	<class name="com.lovo.po.WifePO" table="wife" >
		<id name="id" column="w_id" type="int">
			<!-- 注意!這裡的ID不在是引用husband表的ID了 -->
			<generator class="increment"></generator>
		</id>
		<property name="name" column="w_name" type="string"></property>
		<many-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"
		unique="true" column="fk_hus_id"></many-to-one> 
		<!-- 這裡是要表示一對一所以“unique="true"”是不可缺少的。column指明資料庫表的外來鍵欄位 -->
	</class>
</hibernate-mapping>

轉自:點選開啟連結