在Hibernate中,在對象和對象間存在下面幾種關(guān)系:一對一,一對多,多對一和多對多,一對一比較簡(jiǎn)單,這里我不講了,今天主要談?wù)劯缸雨P(guān)系和多對多的關(guān)系
先談?wù)劯缸雨P(guān)系.假設我們有一個(gè)簡(jiǎn)單的從Parent到Child對象的<one-to-many>關(guān)聯(lián):
<set name="children">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
建立了上面的映射,我們可以在編寫(xiě)下面的代碼來(lái)實(shí)現
Parent p=newParent();
Child c=newChild();
p.getChileren().add(c);
session.save(p);
session.flush();
我們來(lái)分析下到底Hibernate為我們做了什么
首先創(chuàng )建Insert語(yǔ)句來(lái)生成Child記錄
然后通過(guò)update來(lái)更新parent到child之間的關(guān)系
但是我們仔細分析發(fā)現這里面存在一個(gè)很大問(wèn)題,問(wèn)題出在insert一個(gè)child時(shí)候,這時(shí)把child記錄中的parent_id設置為null,原因在于這個(gè)時(shí)候還沒(méi)有建立parent和child之間的關(guān)系,parent_id無(wú)法確定,如果在我們定義的child表中對parent_id不允許null,那程序執行將會(huì )出錯.對于這個(gè)問(wèn)題的解決,簡(jiǎn)單的辦法是將child表中的parent_id設置為允許null,但這不是一個(gè)好的設計,而且可能對系統的執行效率帶來(lái)影響.我們這里換種解決辦法,建立child到parent的多對一的連接,因而我們在child.hbm.xml中加上下面一句
<many-to-onename="parent"column="parent_id"not-null="true"/>
但需要注意,因為先前在child.hbm.xml中我們已經(jīng)定義了到字段parent_id的關(guān)聯(lián),因此要把前面對字段parent_id定義的關(guān)聯(lián)刪除,否側會(huì )造成重復定義,還有一點(diǎn),需要修改下parent.hbm.xml
<setname="children"inverse="true">
<keycolumn="parent_id"/>
<one-to-manyclass="Child"/>
</set>
這里增加inverse="true",因為系統缺省inverse="false",inverse="true"的作用是將parent變成被調用方,從而告訴系統不用去更改連接,連接由child來(lái)完成,下面是JAVA代碼實(shí)現
Parent p=new Parent();
Child c=newChild();
c.setParent(p);
p.getChileren().add(c);
session.save(p);
session.flush();
接下來(lái)我們談?wù)劧鄬Χ嗟年P(guān)系,這種關(guān)系用的不多,原因在于需要額外生成表來(lái)維護這種關(guān)系,并且會(huì )造成對對象的反復查詢(xún),這里我們以role和group為例,一個(gè)role可以對應多個(gè)group,而一個(gè)group也同樣對應多個(gè)role,我們在group.hbm.xml中加入下面的一段
<Set name=”roles” table=”t_group_role” inverse=”false” cascade=”save-update”>
<key column=”group_id”></key>
<many-to-many class=”Role” column=”role_id”/>
</Set>
其中t_group_role是group到role的映射表
我們這里將cascade設置為save-update,而不是all,因為對于delete操作,如果設置為all,這樣會(huì )在刪除group時(shí)候把group對應的role一樣刪除,這是我們不原意看到的,而設置為save-update不會(huì )有問(wèn)題,在delete操作時(shí)候,不但不會(huì )刪除role,同時(shí)由于設置了save-update而會(huì )更新t_group_role,刪除掉t_group_role 中和group相關(guān)記錄
相關(guān)的JAVA實(shí)現
Role role1=new Role();
Role role2=new Role();
Group group=new Group();
group.getRoles().add(role1);
group.getRoles().add(role2);
session.save(group);
session.flush();
對于Role.hbm.xml對groups采用類(lèi)似的定義,這里不在敘述
聯(lián)系客服