標籤: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來維護關係。
通過總結,對比之後特別清晰,簡單易懂。下篇部落格繼續分析。