一對一關(guān)系在實(shí)際生活中是比較常見的,如果學(xué)生與身份證的關(guān)系,學(xué)生與檔案的關(guān)系等等。
一對一關(guān)系在Hibernate中的實(shí)現(xiàn)有兩種方式,分別是主鍵關(guān)聯(lián)和外鍵關(guān)聯(lián)。
以主鍵關(guān)聯(lián)
主鍵關(guān)系的重點(diǎn)是:關(guān)聯(lián)的兩個(gè)實(shí)體共享一個(gè)主鍵值。
Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student" lazy="true"><!--把類和表關(guān)聯(lián)起來-->
<id name="id" unsaved-value="null"><!--id的產(chǎn)生方式是uuid.hex-->
<generator class="uuid.hex"/>
</id>
<property name="name" type="sring"/>
<one-to-one name="cer"
class="model.Certificate"
fetch="join"
cascade="all"
/><!--映射對應(yīng)的身份證對象-->
</class>
</hibernate-mapping>
Certificate.hbm.xml
...
<hibernate-mapping>
<class name="model.Certificate" table="certificate" lazy="true">
<id name="id">
<!--外鍵生成機(jī)制,引用stu對象的主鍵作為certificate數(shù)據(jù)表的主鍵和外鍵-->
<generator class="foreign">
<param name="property">stu</param>
</generator>
</id>
<one-to-one name="stu"
class="model.Student"
constrained="true" <!--表示Certificate引用了stu的主鍵作為外鍵-->
/>
</class>
</hibernate-mapping>
上述的兩個(gè)配置文件在<one-to-one>標(biāo)簽中都沒有設(shè)置column屬性
(實(shí)際上<one-to-one>標(biāo)簽本身就沒有column屬性)。
以外鍵關(guān)聯(lián)
以外鍵關(guān)聯(lián)的重點(diǎn)是:兩個(gè)實(shí)體各自有不同的主鍵,但其中一個(gè)實(shí)體有一個(gè)外鍵引用
了另一個(gè)表的主鍵。
Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student" lazy="true">
<id name="id" nusaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="sring"/>
<one-to-one name="cer"
class="model.Certificate"
fetch="join"
cascade="all"
/><!--映射對應(yīng)的身份證對象-->
</class>
</hibernate-mapping>
可以看到Student.hbm.xml和以主鍵關(guān)聯(lián)時(shí)的代碼是一樣的,并沒有改變。
Certificate.hbm.xml
...
<hibernate-mapping>
<class name="model.Certificate" table="certificate" lazy="true">
<id name="id">
<generator class="uuid.hex"/> <!--不再是foreign了-->
</id>
<many-to-one name="stu"
class="model.Student"
unique="true" <!--唯一的多對一,其實(shí)也就變成了一對一關(guān)系-->
column="stu_id"
/>
</class>
</hibernate-mapping>
以外鍵關(guān)聯(lián)的一對一,其實(shí)本質(zhì)上變成了一對多的雙向關(guān)聯(lián)了,編寫時(shí)直接
按照一對多和多對一的要求編寫,最后在many-to-one這一邊上加上一個(gè)
unique="true"即可。
posted on 2007-12-29 14:00
Ke 閱讀(1763)
評論(0) 編輯 收藏 所屬分類:
hibernate