在上次的博文Hibernate從入門到精通(五)一對一單向關聯映射中我們講解了一下一對一單向關聯映射,這次我們繼續講解一下與之對應的一對一雙向關聯映射。
一對一雙向關聯 與一對一單向關聯映射所不同的的是在一對一雙向關聯中,不但在一個對象(Person)中存在另一個對象(IdCard)的引用,而在另一個對象(IdCard)中也存在對該對象(Person)的引用,這樣即可以在載入該對象(Person)的時候找到另一個對象(IdCard),也可以在載入另一個對象(IdCard)的時候找到該對象(Person)。
類結構圖如下所示: 具體代碼如下所示: [java] view plain copy print ? public class Person { private int id; private String name; private 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; } public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } } public class IdCard { private int id; private String cardNo; private Person person; 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; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
public class Person {private int id;private String name;private 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;}public IdCard getIdCard() {return idCard;}public void setIdCard(IdCard idCard) {this.idCard = idCard;}}public class IdCard {private int id;private String cardNo;private Person person;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;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}}
與一對一單向關聯映射相同,一對一雙向關聯映射同樣關聯的策略不同會產生不同的表結構,也可以分為主鍵關聯和唯一外部索引鍵關聯。但與一對一單向關聯映射相同的是產生的表結構,即一對一雙向關聯映射與一對一單向關聯相比,只是改變了一對一關聯映射的載入,並沒有改變儲存。
主鍵關聯 主鍵關聯表結構如下: 同一對一單向關聯映射類似,主鍵關聯即利用主鍵進行關聯,關聯主鍵的值相同。其相應的*.hbm.xml設定檔代碼如下:
[html] view plain copy print ? <class name="com.zs.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person"/> </class> <class name="com.zs.hibernate.Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard" constrained="true"/> </class>
<class name="com.zs.hibernate.IdCard" table="t_idCard"><id name="id"><generator class="native"/></id><property name="cardNo"/><one-to-one name="person"/></class><class name="com.zs.hibernate.Person" table="t_person"><id name="id"><generator class="foreign"><param name="property">idCard</param></generator></id><property name="name"/><one-to-one name="idCard" constrained="true"/></class>
唯一外部索引鍵關聯
唯一外部索引鍵關聯表結構如下:
一對一雙向關聯映射的外部索引鍵關聯映射也與一對一單向關聯映射的外部索引鍵關聯映射類似,在其一對一的指向端(Person)存在一個唯一外鍵,該唯一外鍵與被指向端(IdCard)相關聯,關聯主鍵的值相同。其相應的*.hbm.xml設定檔代碼如下:
[html] view plain copy print ? <class name="com.zs.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person" property-ref="idCard"/> </class> <class name="com.zs.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="idCard" unique="true"/> </class>
<class name="com.zs.hibernate.IdCard" table="t_idCard"><id name="id"><generator class="native"/></id><property name="cardNo"/><one-to-one name="person" property-ref="idCard"/></class><class name="com.zs.hibernate.Person" table="t_person"><id name="id"><generator class="native"/></id><property name="name"/><many-to-one name="idCard" unique="true"/></class>
同樣利用在類檔案中註解的方式也可以取代XML配置映射。
到此為止,單向和雙向的一對一關聯我們就講解完畢了。講的不夠細,僅僅給大家講解了一下執行個體和幾點區別,但對於掌握和應用Hibernate這些就可以了。下次我們繼續講解Hibernate映射的其他幾種