1. 程式人生 > >【SSH系列】Hibernate對映 -- 一對一單向關聯對映

【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,效果如下所示: