知道了多對(duì)1關(guān)聯(lián)映照的映照原理,我們?cè)賮砜?對(duì)1關(guān)聯(lián)的情況,1對(duì)1分映照有兩種實(shí)現(xiàn)方案:
對(duì)其中關(guān)聯(lián)的情況我們又各分為單向、雙向兩種,而對(duì)1對(duì)1,Hibernate采取one-to-one標(biāo)簽進(jìn)行標(biāo)識(shí)。
我們拿人(Person)與身份證件(IdCard)為1對(duì)1關(guān)聯(lián)對(duì)象的示例,他們的實(shí)體關(guān)系圖為:
采取第1種方案,則Person對(duì)應(yīng)數(shù)據(jù)庫表與IdCard對(duì)應(yīng)數(shù)據(jù)庫表中的主鍵是逐一對(duì)應(yīng)的,不需要添加過剩的字段來表示外鍵。Person關(guān)聯(lián)映照文件中的配置為:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd">
<hibernate-mapping>
<class name="com.tgb.hibernate.Person" table="t_person">
<id name="id">
<!-- 主鍵策略foreign -->
<generator class="foreign">
<!-- property指關(guān)聯(lián)對(duì)象 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name" />
<one-to-one name="idCard" constrained="true" />
</class>
</hibernate-mapping>
注:one-to-one標(biāo)簽中的 constrained=”true”表示當(dāng)前主鍵同時(shí)也是1個(gè)外鍵,參照IdCard中的主鍵。
1.調(diào)用session的Load方法,得出Person對(duì)象的級(jí)聯(lián)班級(jí)對(duì)象IdCard
public void testLoad(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
Person person = (Person)session.load(Person.class, 1);
System.out.println("person.name = " + person.getName());
System.out.println("person.idCard.cardNo = " + person.getIdCard().getCardNo());
session.save(person);
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
}
與上篇文章介紹的類似,通過one-to-one標(biāo)簽的作用,我們查詢Person對(duì)象的同時(shí),級(jí)聯(lián)查詢除IdCard對(duì)象
2.默許級(jí)聯(lián)保存Idcard機(jī)制
public void testSave(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardNo("11111111111");
Person person = new Person();
person.setName("張3");
person.setIdCard(idCard);
session.save(person);
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
}
上篇文章中我們提到過,在援用有Transient對(duì)象的Persistent狀態(tài)的對(duì)象進(jìn)行保存時(shí),會(huì)出現(xiàn)異常,但在1對(duì)1主鍵關(guān)聯(lián)映照上不會(huì)出現(xiàn)此種情況。也就是說,1對(duì)1默許帶有cascade屬性。對(duì)1對(duì)1主鍵關(guān)聯(lián)映照,雙向關(guān)聯(lián)的配置即是在IdCard端加入one-to-one標(biāo)簽便可,此標(biāo)簽僅影響加載,不影響存儲(chǔ)。
綜合來看將來如果改成多對(duì)1則不可修改,靈活性較差、擴(kuò)大性不好。
我們可將1對(duì)1的情況看做是多對(duì)1情況的1種極端體現(xiàn),我們可以采取many-to-one標(biāo)簽配合unique屬性來給其相對(duì)應(yīng)的表上添加外鍵字段,這類方式可解決使用主鍵關(guān)聯(lián)映照的弊端。相干映照文件以下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd">
<hibernate-mapping>
<class name="com.tgb.hibernate.Person" table="t_person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<many-to-one name="idCard" unique="true"></many-to-one>
</class>
</hibernate-mapping>
有關(guān)相應(yīng)的操作,可參照前1篇文章的多對(duì)1下示例。
我們可以看到1對(duì)1主鍵關(guān)聯(lián)到1對(duì)1外鍵關(guān)聯(lián)的轉(zhuǎn)變可以看做是另外一種角度下看待問題,通過這樣的思想,1些本來要求刻薄的情況我們一樣可以通過另外一種方式來處理,到達(dá)相同的效果,并且實(shí)現(xiàn)將來變更的靈活應(yīng)對(duì)。