在上次的博文Hibernate從入門到精通(五)一對一單向關聯映射中我們講解了一下一對一單向關聯映射, 這次我們繼續講解一下與之對應的一對一雙向關聯映射。
一對一雙向關聯
與一對一單向關聯映 射所不同的的是在一對一雙向關聯中,不但在一個對象(Person)中存在另一個對象(IdCard)的引用,而在另一 個對象(IdCard)中也存在對該對象(Person)的引用,這樣即可以在加載該對象(Person)的時候找到另一個對象 (IdCard),也可以在加載另一個對象(IdCard)的時候找到該對象(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配置文件代碼如 下:
<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配置文件代碼如 下:
<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映射的其他幾種。