1. 程式人生 > >【SSH進階之路】Hibernate映射——一對一單向關聯映射(五)

【SSH進階之路】Hibernate映射——一對一單向關聯映射(五)

技術 iyu 標識 tails for sso 3.0 sdn 例如

【SSH進階之路】Hibernate基本原理(一) ,小編介紹了Hibernate的基本原理以及它的核心,採用對象化的思維操作關系型數據庫。

【SSH進階之路】Hibernate搭建開發環境+簡單實例(二),小編搭建了基本Hibernate的開發環境。並做了一個簡單實例,對它的基本原理有了一個理性的認識。

【SSH進階之路】Hibernate基本映射(三),我們介紹了Hibernate的基本映射(即對一個實體進行映射)的相關概念。並給大家實現相關實例。比較簡單。

【SSH進階之路】Hibernate映射——多對一單向關聯映射(四)。我們介紹了多對一的關聯映射,並具體了講解了,映射技巧。這篇我們依然使用此映射技巧,幫助大家更好的理解。

以下開始今天的愉快之旅。

映射原理

兩個實體對象之間是一對一的關聯映射,即一個對象僅僅能與另外唯一的一個對象相相應

比如:一個人(Person)僅僅有一張身份證(IdCard)。我們看一下這個樣例的對象模型,例如以下圖所看到的:

對象模型

技術分享

從上圖中能夠看出:

1、一個人僅僅有一張身份證,唯一的一個身份證號。對象之間是一對一的關系。

2、人(Person)持有身份證(IdCard)的引用,所以,兩個對象關系維護由person端決定。

從對象模型映射成關系模型,有兩種方式:主鍵關聯和唯一外鍵關聯,我們繼續看以下的內容。

分類:

主鍵關聯:

1、兩個實體對象的主鍵一樣,以表明它們之間的一一相應關系。

2、不須要多余的外鍵字段來維護關系,僅通過主鍵來關聯,即Person的主鍵要依賴IdCard的主鍵,他們共用一個主鍵值。

以上兩點恰與唯一外鍵關聯相反。

主鍵關聯的關系模型

技術分享

Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.liang.hibernate">
	<class name="Person" table="t_person">
		<id name="id">
		<!-- 採用foreign生成策略。forgeign會取得另外一個關聯對象的標識 -->
			<generator class="foreign" >
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"></property>
		<!-- 
			one-to-one指示hibernate怎樣載入其關聯對象,默認依據主鍵載入
			也就是拿到關系字段值,依據對端的主鍵來載入關聯對象
			
			constrained="true"表示約束,當前主鍵(person的主鍵)還是一個外鍵
			參照了對端的主鍵(IdCard的主鍵),也就是會生成外鍵約束語句
		 -->
		 <!-- idCard屬性。表達的是本對象與IdCard的一對一關系。 -->
		<one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>
	</class>
</hibernate-mapping>

生成的表結構以及測試數據:

技術分享技術分享

唯一外鍵關聯:

1、兩個實體對象用一個外鍵來關聯。以表表明對象之間的關系。

2、事實上它是多對一關聯映射的特例,多的一端加上唯一的限制之後,用來表示一對一的關聯關系

所以它採用多對一的標簽來映射。例如以下所看到的:

<!-- 採用<mang-to-one>標簽來映射,指定多的一端unique為true,
	這樣就限制了多的一端的多重性為一,就是這樣來映射的。

--> <many-to-one name="" unique="true"></many-to-one>

唯一外鍵的關系模型

技術分享

Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.liang.hibernate">
	<class name="Person" table="t_person">
		<id name="id">
			<generator class="native" ></generator>
		</id>
		<property name="name"></property>
		<!-- 因為它是一對一的唯一外鍵關聯,它是多對一關聯的特例,凝視能夠直接寫成多對一關聯-->
		<!-- idCard屬性,表達的是本對象與IdCard的多對一關系。 -->
		<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>	
	</class>
</hibernate-mapping>

生成的表結構以及測試數據:

技術分享技術分享

其它同樣代碼例如以下:

Person

public class Person {
	private int id;
	private String name;
	private IdCard idCard;
	
	public IdCard getIdCard() {
		return idCard;
	}
	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}
	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;
	}
}

IdCard

public class IdCard {
	private int id;
	private String cardNo;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCardNo() {
		return cardNo;
	}
	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}
}

IdCard.hbm.xml

<?xml version="1.0"?

> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"> <class name="IdCard" table="t_idCard"> <id name="id"> <generator class="native"></generator> </id> <property name="cardNo"></property> </class> </hibernate-mapping>

建議

因為一對一主鍵關聯映射具有下面兩個缺點:

1、靈活性差。沒有辦法改成多對一關聯映射,不能應變多變的需求;

2、必須先保存關聯對象IdCard,之後才幹保持Person。

所以,在映射一對一單向關聯映射時,我們採用唯一外鍵關聯映射。


下篇博文。我們介紹一對一雙向關聯映射,謝謝關註。

【SSH進階之路】Hibernate映射——一對一單向關聯映射(五)