【Hibernate學習】 ——ORM(一)

來源:互聯網
上載者:User

標籤:style   class   blog   code   java   http   

           Hibernate是一種能實現ORM的架構。ORM即Object Relational Mapping,對象關係映射。也就是將關聯式資料庫中表的資料對應成為對象,也就是說將表與表之間的操作映射成對象與對象之間的操作,通過實體類來達到動作表的目的。總之就是把對資料庫的操作轉化為對對象的操作,從而更體現了物件導向的思想。

 

          一對一關聯映射策略包括主鍵關聯和唯一外部索引鍵關聯。

 

單向一對一


         主鍵關聯

          讓兩個對象有相同的主鍵值,表名它們之間的一對一關聯性,資料庫沒有額外的欄位來維護它們之間的關係,僅僅通過表的主鍵來關聯。如:通過兩個表中id來維護關係,沒有額外的欄位或者表去維護其之間的關係。



        可看出,既然是單向關聯,那麼Person可以持有IdCard對象,而IdCard對象不知道Person的存在。故因此由Person端來維護關係。


Person.hbm.xml關係代碼

<class name="com.bjpowernode.hibernate.Person" table="t_person"><id name="id">   <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>


IdCard.hbm.xml代碼

<class name="com.bjpowernode.hibernate.Person" table="t_idCard"><id name="id">   <generator class="native"></id>    <property name="cardNo"/></class>

      唯一外部索引鍵關聯

         外部索引鍵關聯被拿來是用於多對一的配置,但是如果加上唯一的限制之後,也可以用來表示一對一的關聯關係。因此唯一外部索引鍵關聯是多對一的一種特殊情況。是通過<many-to-one>映射的。

 

        表關係:

          通過<many-to-one>映射,會在person端產生idCard欄位,通過idCard欄位來維護關係。unique表示是唯一外部索引鍵關聯。故還是通過person端來維護關係,所以和主鍵關聯對比只需要更改person關係中的標籤為<many-to-one>,不需要更改idCard關係代碼。

 

主要改變的是Person類的映射:

<class name="com.bjpowernode.hibernat.Person" table="t_person"><id name="id"><generator class="native"/></id><property name="name"/><!--設定idCard為外鍵,唯一標識為true--><many-to-one name="idCard" unique="true"/></class>

          

       小結:通過表關係可以看出來,主鍵關聯是通過person表中的id來維護關係,沒有多餘的欄位,相當於id既當主鍵又當外鍵,修改資料很難;而唯一外部索引鍵關聯是加入第三個欄位來維護關係,可擴充性顯然比主鍵關聯好。

 

 

       ——————————————————————————————————————————————

 

雙向一對一

        主鍵關聯

         上面是單向的,那麼設定成雙向的,也就是IdCard也想得到與之對應的Person對象。那麼IdCard就需要加入person屬性,如下:


Person關係映射同主鍵關聯映射。


idCard關係映射:

<class name="com.bjpowernode.hibernate.Person" table="t_idCard"><id name="id">   <generator class="native"></id>    <property name="cardNo"/><one-to-one name="person"/></class>

          比起單向關聯外,雙向關聯的關係在IdCard端加入<one-to-one>標籤。idCard也持有Person的引用。<one-to-one>標籤不影響儲存,隻影響載入,故單向關聯和雙聯關聯的表結構是一樣的。

 

      唯一外部索引鍵關聯

 

        表關係:

同單向關聯的關係一樣,產生的表結構也一樣。

person關係代碼同單向。


idCard關係代碼:

<class name="com.bjpowernode.hibernate.Person" table="t_idCard"><id name="id">   <generator class="native"></id>    <property name="cardNo"/><!--體現雙向關聯--><one-to-one name="person" property-ref="idCard"/></class>


          同樣是在idCard端加入關聯<one-to-one>標籤。需要加如property-ref="idCard",為關係欄位的名稱。因為idCard不為主鍵,所以要加入此屬性。

 

  ———————————————————————————————————————————————

 

 

          綜上,單向和雙向的區別就是對關係的持有,在idCard端加入<one-to-one>標籤,此標籤不影響儲存,隻影響載入。所以上面四種關係可以看成是兩種關係,主鍵關聯和唯一外部索引鍵關聯。而主鍵關聯和唯一外部索引鍵關聯的區別是主外鍵的關係,前者是Person中id是主鍵又是外鍵,後者是添加一個關係欄位作為外鍵。但是都是Person來維護關係。

 

         通過總結,對比之後特別清晰,簡單易懂。下篇部落格繼續分析。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.