Hibernate學(xué)習(xí)(二) ---【一對一主鍵單向關(guān)聯(lián)】
為了簡潔,我們創(chuàng)建兩張表分別是Student和Certificate,它們只有主鍵ID和另外一個對象的引用標(biāo)識符。從student可以加載certificate。單向

1.主鍵關(guān)聯(lián)
所謂以主鍵關(guān)聯(lián),是指兩張數(shù)據(jù)庫表通過主鍵取得一對一的關(guān)聯(lián)關(guān)系,也就是說一張表的主鍵是引用另一張表的外鍵。例如,對于Student和Certificate對象,一般來說是Student是主體,Certificate對象依附Student存在。它們主鍵關(guān)聯(lián)的一對一關(guān)系就是在數(shù)據(jù)庫中Student和Certificate表使用相同的主鍵值,這個由Student對象生成。Certificate應(yīng)用這個主鍵值。它們共享同一主鍵值,這通過在Certificate表中設(shè)置外鍵來實現(xiàn)。一對一主鍵關(guān)聯(lián)映射中默認(rèn)cascade="true";
2.一對一以主鍵關(guān)聯(lián)的使用
既然它們是共用一個主鍵值,關(guān)鍵是如何讓另一張表引用已經(jīng)生成的主鍵值。這在Hibernate中使用的是主鍵的foreign生成機制。
下面是Student和Certificate類的配置源碼。
Student.hbm.xml
<hibernate-mapping>
<class name="model.Student" table="student" lazy="true"><!--把類數(shù)表關(guān)聯(lián)起來-->
<id name="id" unsaved-value="null"><!--id的產(chǎn)生方式是uuid.hex-->
<generator class="uuid.hex" />
</id>
<property name="name" type="String"><!--映射學(xué)生名-->
<property name="carId" type="String"><!--映射映射號-->
<property name="age" type="int"><!--映射學(xué)生年齡-->
<one-to-one name="cer"
class="model.Certificate"
fetch="join" cascade="all" constrained="true"/><!--映射文件的身份證對象-->
</class>
</hibernate-mapping>
<class name="model.Student" table="student" lazy="true"><!--把類數(shù)表關(guān)聯(lián)起來-->
<id name="id" unsaved-value="null"><!--id的產(chǎn)生方式是uuid.hex-->
<generator class="uuid.hex" />
</id>
<property name="name" type="String"><!--映射學(xué)生名-->
<property name="carId" type="String"><!--映射映射號-->
<property name="age" type="int"><!--映射學(xué)生年齡-->
<one-to-one name="cer"
class="model.Certificate"
fetch="join" cascade="all" constrained="true"/><!--映射文件的身份證對象-->
</class>
</hibernate-mapping>
以上的one-to-one設(shè)置為cascade="all",表示增加、刪除、及修改Student對象時,都會級聯(lián)增加、刪除、修改Certificate對象。
constrained="true"約束這句話也要加上
Certificate.hbm.xml











//建立身份證
Certificate cer = new Certificate();
cer.setDescribe("spark");
//新建學(xué)生
Student stu = new Student();
stu.setName("spark");
stu.setCardid("10001");
stu.setAge(22);
//設(shè)置學(xué)生和身份證之間的關(guān)聯(lián)
stu.setCer(cer);
StudentDAO.saveObj(stu);
Certificate cer = new Certificate();
cer.setDescribe("spark");
//新建學(xué)生
Student stu = new Student();
stu.setName("spark");
stu.setCardid("10001");
stu.setAge(22);
//設(shè)置學(xué)生和身份證之間的關(guān)聯(lián)
stu.setCer(cer);
StudentDAO.saveObj(stu);
posted on 2008-07-24 12:42 生命的綻放 閱讀(1856) 評論(0) 編輯 收藏 所屬分類: Hibernate