【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;
所以,在映射一對一單向關聯映射時,我們採用唯一外鍵關聯映射。
下篇博文,我們介紹一對一雙向關聯映射,謝謝關注。
轉載自:http://blog.csdn.net/jiuqiyuliang/article/details/40350515