【SSH系列】Hibernate對映 -- 一對一單向關聯對映
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
對映原理
一對一關聯對映:兩個實體物件之間是一對一的關聯對映,即一個物件只能與另外唯一的一個物件相對應。有兩種策略可以實現一對一的關聯對映:
a、主鍵關聯:即讓兩個物件具有相同的主鍵值,以表明她們之間的一一對應的關係;資料庫表不會有額外的欄位來維護她們之間的關係,僅通過表的主鍵來關聯。
b、唯一外來鍵關聯:外來鍵關聯,本來適用於多對一的配置,但是如果加上唯一的限制之後,也可以表示一對一關聯關係,談戀愛就是一一對應,一個男朋友對應一個女朋友,如果不是,只能說明道德問題,ok,再比如,我們每個人(person)只能有一張身份證(IdCard),不需要多餘的外來鍵欄位來維護關係,僅通過主鍵來關聯,即Person的主鍵要依賴IdCard的主鍵,他們共用一個主鍵值。接著,小編就person和idCard為例,講解兩種策略實現一對一的關聯對映。不足之處,還請小夥伴們多多指教`(*∩_∩*)′。
小編依然從uml圖入手,瞭解她們的物件模型和關係模型,首先我們來看一對一的物件模型,類圖如下所示:
從上面的uml類圖包括實際生活中,我們很容易得出結論,一個人只有一張身份證,並且我們的身份證號碼都是唯一的,因為我們每個人都是獨一無二的Person和IdCard之間是一一對一的關係,Person持有IdCard的引用,所以,兩個物件關係維護由Person端來決定。ok,接下來,小編分別講解一對一單向關聯對映的兩種策略。
主鍵關聯
根據上面的物件模型,我們畫出下面的關係模型,如下所示:
在博文的開頭,小編已經介紹過,主鍵關聯,即讓兩個物件具有相同的主鍵值,以表明她們之間的一一對應的關係;資料庫表不會有額外的欄位來維護她們之間的關係,僅通過表的主鍵來關聯。結合我們person和idCard的例子,就是Person的主鍵要依賴IdCard的主鍵,他們共用一個主鍵值。 ok,接著,我們開始編寫相應的程式碼。
第一步、建立專案,編寫Pserson和Person兩個實體類,並且生成get和set方法程式碼如下所示,首先是Person類:
package com.bjpowernode.hibernate;public class Person { private int id; private String name; private IdCard idCard; public int getId() { return id; } public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
接著IdCard類,程式碼如下所示:
package com.bjpowernode.hibernate;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; } }
第二步、編寫Person.hbm.xml和IdCard.hbm.xml檔案中的程式碼,首先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> <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指示hibernate如何載入其關聯物件,預設根據主鍵載入 也就是拿到關係欄位值,根據對端的主鍵來載入關聯物件 constrained="true表示,當前主鍵(person的主鍵)還是一個外來鍵 參照了對端的主鍵(IdCard的主鍵),也就是會生成外來鍵約束語句 --> <one-to-one name="idCard" constrained="true"/> </class></hibernate-mapping>
接著編寫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> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name ="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping>
第三步、編寫hibernate.cfg.xml的程式碼,建立資料庫並且新增相應的對映,程式碼如下所示:<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory > <!-- MySql資料庫驅動 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 資料庫名稱 --> <property name="hibernate.connection.url"> jdbc:mysql:///hibernate_one2one_pk_1</property> <!-- 資料庫的使用者名稱 --> <property name="hibernate.connection.username">root</property> <!-- 資料庫的密碼 --> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 顯示語句 --> <property name="hibernate.show_sql">true</property> <!-- 格式排版 --> <!-- <property name="hibernate.format_sql">true</property> --> <mapping resource="com/bjpowernode/hibernate/Person.hbm.xml"/> <mapping resource="com/bjpowernode/hibernate/IdCard.hbm.xml"/> </session-factory></hibernate-configuration>
接著,建立資料庫,並且執行ExportDB,效果如下所示: