Hibernate之一對一關聯映射

 Hibernate中一對一關聯映射共分爲兩種,一種是一對一主鍵關聯映射,另一種是一對一唯一外鍵關聯映射。下面簡單介紹一下這兩種關聯映射。


一對一主鍵關聯映射

一對一主鍵關聯映射的兩個實體有相同的ID。這種映射又分爲單向一對一關聯主鍵映射和雙向一對一主鍵關聯映射。


單向一對一主鍵關聯映射

實例類圖

映射文件IdCard.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>
映射文件Person.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<!-- 採用foreign生成策略,forgeign會取得關聯對象的標識 -->
			<generator class="foreign">
				<!-- property只關聯對象 -->
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>
生成的SQL語句
create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
		
create table t_person (id integer not null, name varchar(255), primary key (id))
		
alter table t_person add index FK785BED803EEB3F3E (id), add constraint FK785BED803EEB3F3E foreign key (id) references t_idCard (id)
表結構如下圖:


注意:
保存關係維護端對象,與之對應的對象會同時保存。反之則不行。查詢時也只能從關係維護端找到另一個對象,反之則找不到。

雙向一對一主鍵關聯映射

實例類圖:


映射文件IdCard.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person"/>
	</class>
</hibernate-mapping>
映射文件Person.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<!-- 採用foreign生成策略,forgeign會取得關聯對象的標識 -->
			<generator class="foreign">
				<!-- property只關聯對象 -->
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>
constrained="true表示,當前主鍵(person的主鍵)還是一個外鍵,參照了對端的主鍵(IdCard的主鍵),也就是會生成外鍵約束語句

生成的SQL語句
create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
		
create table t_person (id integer not null, name varchar(255), primary key (id))
		
alter table t_person add index FK785BED803EEB3F3E (id), add constraint FK785BED803EEB3F3E foreign key (id) references t_idCard (id)
表結構如下圖:

注意:
雙向一對一關聯映射的關鍵點就是one-to-one標籤,是它告訴hibernate對象之間是如何關聯的。與單向一對一主鍵關聯映射相同的是保存關係維護端對象,與之對應的對象會同時保存。反之則不行。但是查詢的時候,雙方都能找到對方。

小結
從上面我們可以看到,單向一對一主鍵關聯映射和雙向一對一主鍵關聯映射僅查一個one-to-one標籤,但它們生成的sql語句卻是完全相同的,也就是說one-to-one標籤隻影響查詢,不影響存儲。

一對一唯一外鍵關聯映射

單向一對一唯一外鍵關聯映射

實例類圖

映射文件IdCard.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>
映射文件Person.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>
使用<many-to-one>標籤來映射,指定多的一端unique屬性爲true,這樣就限定了多的一端的多重性爲一,實現了一對一,其實它是多對一的特例。

雙向一對一唯一外鍵關聯

實例類圖


映射文件IdCard.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person" property-ref="idCard"/>
	</class>
</hibernate-mapping>
映射文件Person.hbm.xml
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>

一對一唯一外鍵關聯映射生成的sql語句
create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
		
create table t_person (id integer not null auto_increment, name varchar(255), idCard integer unique, primary key (id))
		
alter table t_person add index FK785BED80F7C7B4CE (idCard), add constraint FK785BED80F7C7B4CE foreign key (idCard) references t_idCard (id)

表結構


注意:
單向一對一唯一外鍵關聯映射和雙向一對一唯一外鍵關聯映射生成的sql語句完全相同,區別同上邊的一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章