【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
【SSH進(jìn)階之路】Hibernate基本原理(一) ,小編介紹了Hibernate的基本原理以及它的核心,采用對(duì)象化的思維操作關(guān)系型數(shù)據(jù)庫。
【SSH進(jìn)階之路】Hibernate搭建開發(fā)環(huán)境+簡(jiǎn)單實(shí)例(二),小編搭建了基本Hibernate的開發(fā)環(huán)境,并做了一個(gè)簡(jiǎn)單實(shí)例,對(duì)它的基本原理有了一個(gè)理性的認(rèn)識(shí)。
【SSH進(jìn)階之路】Hibernate基本映射(三),我們介紹了Hibernate的基本映射(即對(duì)一個(gè)實(shí)體進(jìn)行映射)的相關(guān)概念,并給大家實(shí)現(xiàn)相關(guān)實(shí)例,比較簡(jiǎn)單。
【SSH進(jìn)階之路】Hibernate映射——多對(duì)一單向關(guān)聯(lián)映射(四),我們介紹了多對(duì)一的關(guān)聯(lián)映射,并詳細(xì)了解說了,映射技巧,這篇我們依舊使用此映射技巧,幫助大家更好的理解。
?
??????下面開始今天的愉快之旅。
?
映射原理
?
????? 兩個(gè)實(shí)體對(duì)象之間是一對(duì)一的關(guān)聯(lián)映射,即一個(gè)對(duì)象只能與另外唯一的一個(gè)對(duì)象相對(duì)應(yīng)。例如:一個(gè)人(Person)只有一張身份證(IdCard)。我們看一下這個(gè)例子的對(duì)象模型,如下圖所示:
?
對(duì)象模型
?
???????
????????從上圖中可以看出:
??????? 1、一個(gè)人只有一張身份證,唯一的一個(gè)身份證號(hào),對(duì)象之間是一對(duì)一的關(guān)系;
??????? 2、人(Person)持有身份證(IdCard)的引用,所以,兩個(gè)對(duì)象關(guān)系維護(hù)由person端決定。
??????? 從對(duì)象模型映射成關(guān)系模型,有兩種方式:主鍵關(guān)聯(lián)和唯一外鍵關(guān)聯(lián),我們繼續(xù)看下面的內(nèi)容。
?
分類:?
?
?主鍵關(guān)聯(lián):
?
????????1、兩個(gè)實(shí)體對(duì)象的主鍵一樣,以表明它們之間的一一對(duì)應(yīng)關(guān)系;
??????? 2、不需要多余的外鍵字段來維護(hù)關(guān)系,僅通過主鍵來關(guān)聯(lián),即Person的主鍵要依賴IdCard的主鍵,他們共用一個(gè)主鍵值。
??????? 以上兩點(diǎn)恰與唯一外鍵關(guān)聯(lián)相反。
?
?主鍵關(guān)聯(lián)的關(guān)系模型
?Person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"><class name="Person" table="t_person"><id name="id"><!-- 采用foreign生成策略,forgeign會(huì)取得另外一個(gè)關(guān)聯(lián)對(duì)象的標(biāo)識(shí) --><generator class="foreign" ><param name="property">idCard</param></generator></id><property name="name"></property><!-- one-to-one指示hibernate如何加載其關(guān)聯(lián)對(duì)象,默認(rèn)根據(jù)主鍵加載也就是拿到關(guān)系字段值,根據(jù)對(duì)端的主鍵來加載關(guān)聯(lián)對(duì)象constrained="true"表示約束,當(dāng)前主鍵(person的主鍵)還是一個(gè)外鍵參照了對(duì)端的主鍵(IdCard的主鍵),也就是會(huì)生成外鍵約束語句--><!-- idCard屬性,表達(dá)的是本對(duì)象與IdCard的一對(duì)一關(guān)系。 --><one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one></class> </hibernate-mapping>生成的表結(jié)構(gòu)以及測(cè)試數(shù)據(jù):
?
唯一外鍵關(guān)聯(lián):
?
???????1、兩個(gè)實(shí)體對(duì)象用一個(gè)外鍵來關(guān)聯(lián),以表表明對(duì)象之間的關(guān)系。
? ? ?? 2、其實(shí)它是多對(duì)一關(guān)聯(lián)映射的特例,多的一端加上唯一的限制之后,用來表示一對(duì)一的關(guān)聯(lián)關(guān)系。
? ? ?? 所以它采用多對(duì)一的標(biāo)簽來映射,如下所示:
<!-- 采用<mang-to-one>標(biāo)簽來映射,指定多的一端unique為true,這樣就限制了多的一端的多重性為一,就是這樣來映射的。 --> <many-to-one name="" unique="true"></many-to-one>唯一外鍵的關(guān)系模型
Person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"><class name="Person" table="t_person"><id name="id"><generator class="native" ></generator></id><property name="name"></property><!-- 由于它是一對(duì)一的唯一外鍵關(guān)聯(lián),它是多對(duì)一關(guān)聯(lián)的特例,注釋可以直接寫成多對(duì)一關(guān)聯(lián)--><!-- idCard屬性,表達(dá)的是本對(duì)象與IdCard的多對(duì)一關(guān)系。 --><many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one> </class> </hibernate-mapping>生成的表結(jié)構(gòu)以及測(cè)試數(shù)據(jù):
?
?
其他相同代碼如下:
Person
public class Person {private int id;private String name;private IdCard idCard;public IdCard getIdCard() {return idCard;}public void setIdCard(IdCard idCard) {this.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;} }IdCard
public class IdCard {private int id;private String cardNo;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;} }IdCard.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"><class name="IdCard" table="t_idCard"><id name="id"><generator class="native"></generator></id><property name="cardNo"></property></class> </hibernate-mapping>建議
?
由于一對(duì)一主鍵關(guān)聯(lián)映射具有以下兩個(gè)缺點(diǎn):
? ? ? 1、靈活性差,沒有辦法改成多對(duì)一關(guān)聯(lián)映射,不能應(yīng)變多變的需求;
? ? ? 2、必須先保存關(guān)聯(lián)對(duì)象IdCard,之后才能保持Person;
所以,在映射一對(duì)一單向關(guān)聯(lián)映射時(shí),我們采用唯一外鍵關(guān)聯(lián)映射。
? ? ?下篇博文,我們介紹一對(duì)一雙向關(guān)聯(lián)映射,謝謝關(guān)注。
轉(zhuǎn)載于:https://www.cnblogs.com/ainima/p/6330986.html
總結(jié)
以上是生活随笔為你收集整理的【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的System.getPrope
- 下一篇: 学习selenium所须要具备的技术