一對一主鍵關(guān)聯(lián)映射:我們來拿人和身份證舉例。采用一對一主鍵關(guān)聯(lián)映射,他要表達(dá)的意思是人的 id 來自于身份證的 id 。要想在人的表中存數(shù)據(jù),在身份證表中必須有對應(yīng)的 id 的身份證記錄。如圖所示:
表關(guān)系為:
我們看一下具體的實(shí)現(xiàn):
實(shí)體類實(shí)現(xiàn):
public class Person {
private int id ;
private String name ;
private IdCard idCard ; // 提供關(guān)聯(lián)的屬性 …. 省略 get , set 方法 } |
public class IdCard {
private int id ;
private String cardNo ; …. 省略 get , set 方法 }
|
對應(yīng)的映射文件設(shè)置為:
Person.hbm.xml < hibernate-mapping > < class name = "com.bjpowernode.hibernate.Person" table = "t_person" > < id name = "id" > <!-- 采用 foreign 生成策略, forgeign 會取得關(guān)聯(lián)對象的標(biāo)識,通俗點(diǎn)說就是 person 中這個主鍵 id 來自于 idCard 對象的主鍵。而從實(shí)體屬性中可以知道 idCard 為 IdCard 類型,即 Person 中主鍵來自于 IdCard 中的主鍵 --> < generator class = "foreign" > <!-- property 只關(guān)聯(lián)對象 --> < param name = "property" > idCard </ param > </ generator > </ id > < property name = "name" /> <!-- one-to-one 指示 hibernate 如何加載其關(guān)聯(lián)對象,默認(rèn)根據(jù)主鍵加載 也就是拿到關(guān)系字段值,根據(jù)對端的主鍵來加載關(guān)聯(lián)對象 constrained="true 表示,當(dāng)前主鍵 (person 的主鍵 ) 還是一個外鍵 參照了對端的主鍵( IdCard 的主鍵),也就是會生成外鍵約束語句 --> < one-to-one name = "idCard" constrained = "true" /> </ class > </ hibernate-mapping > |
IdCard.hbm.xml < hibernate-mapping > < class name = "com.bjpowernode.hibernate.IdCard" table = "t_idCard" > < id name = "id" > < generator class = "native" /> </ id > < property name = "cardNo" /> </ class > </ hibernate-mapping >
|
采用一對一主鍵關(guān)聯(lián)映射,兩個實(shí)體的主鍵一樣,這樣就不需要加入多余的字段了。我們在加載維護(hù)關(guān)系的一端如例子中提到的 Person 時,從他的實(shí)體類實(shí)現(xiàn)也可以看出,要給他的 IdCard 屬性賦值。但是賦值時,是不需要必須顯示的用 session 的 save 將其變?yōu)? Persistent 狀態(tài)的。因為一對一的主鍵關(guān)聯(lián)映射已經(jīng)為我們執(zhí)行了此操作。也可以說他默認(rèn)了 cascade 級聯(lián)特性。說了一對一主鍵關(guān)聯(lián)映射,自然也少不了雙向關(guān)聯(lián)映射。一對一主鍵雙向關(guān)聯(lián)映射和單向關(guān)聯(lián)映射在存儲方式上是沒有什么不同的。但在查詢上會稍有不同。看一下實(shí)現(xiàn):
實(shí)體實(shí)現(xiàn):
public class IdCard {
private int id ;
private String cardNo ;
private Person person ; // 關(guān)聯(lián) Person 對象 … 省略 get , set 方法 }
|
public class Person {
private int id ;
private String name ;
private IdCard idCard ; // 關(guān)聯(lián) IdCard 對象 … 省略 get , set 方法 }
|
從實(shí)體類上來說,每端都能看到另一端的對象。查詢的時候,我們自然可以從任意一段進(jìn)行查詢了。這是一點(diǎn)不同。再來看映射文件
IdCard.hbm.xml < hibernate-mapping > < class name = "com.bjpowernode.hibernate.IdCard" table = "t_idCard" > < id name = "id" > < generator class = "native" /> </ id > < property name = "cardNo" /> <!-- 相對于單向,只是多了一句 one-to-one --> < one-to-one name = "person" /> </ class > </ hibernate-mapping >
|
Person.hbm.xml < hibernate-mapping > < class name = "com.bjpowernode.hibernate.Person" table = "t_person" > < id name = "id" > < generator class = "foreign" > <!-- property 只關(guān)聯(lián)對象 --> < param name = "property" > idCard </ param > </ generator > </ id > < property name = "name" /> < one-to-one name = "idCard" constrained = "true" /> </ class > </ hibernate-mapping > |
可以看出 Person 的映射文件與單向關(guān)聯(lián)是完全一樣的。在單向關(guān)聯(lián)中,我們只能從 Person 一端查詢的時候才可以查詢到 IdCard 端的值。如果我們只查詢 IdCard 的屬性, Person 是不能被查詢到的。而在雙向關(guān)聯(lián)中,我們則可以通過任意一端查詢到另外一端的屬性。單項和雙項在這一區(qū)別上得到了驗證。
一對一唯一外鍵關(guān)聯(lián)映射請看下一篇博客。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
