歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Hibernate關聯關系的精髓總結

Hibernate關聯關系的精髓總結

日期:2017/3/1 10:49:17   编辑:Linux編程

一 多對一 單向關聯 (以Employee和Dempartment為例)

1.多對一 :一個部門可以有多個員工,一個員工只屬於一個部門

2.多對一的分析

一個部門有多個員工,所以在建外鍵的時候選擇的是在Employee的一方,即是多的一方,因為Hibernate的執行過程是先通過Configure去讀取配置文件中的信息和數據庫建立連接,根據配置文件的信息去找所對應的映射文件,映射文件的作用是把所建立的實體類映射為一個二維表,在映射成二維表的時候在Employee的映射中即在Employee.hbm.xml中設置一個員工所對應的部門,所使用的標簽為:

<many-to-one name="depart" column="depart_id" not-null="true" />

說明:標簽簡明思義為多對一,其中的屬性name是在Employee中設置的Department類的對象,column是在數據庫中外鍵的名字,not-null是不允許為空

在建立實體對象的時候,一的那一方(Dempartment),創建id,name等其他的普通屬性,而在建立多的那一方的實體對象的時候,因為是多對一,所以要增加一個屬性,為:

Dempartment depart;

二 一對多 單項關聯 (以Dempartment和Employee為例)

1.一對多其實和多對一樣的,只是所站的位置不同,所以會有不同的看法,如果是多對一,那麼是一個部門有多個員工,因為是一對多,所以要在一的那一方,即是Dempartment中設置屬性的時候要設置Employee對象,而Employee是多個,所以用集合存儲起來,在建立實體類的時候,只需在Dempartment類中多寫一個:

Set<Employee> emps;

屬性即可。

2.在寫配置文件的時候,在Demparment.hbm.xml中只需寫一個set標簽即可:

<set name="emps">

<!-- 根據外鍵的值查詢,而不是查詢所有的記錄-->

<key column="depart_id"/>

<!-- 告訴Hibernate emps是集合屬性,是一對多的關聯 -->

<one-to-many class="Employee" />

</set>

注:不管是多對一還是一對多,實體類所映射的數據庫表中的結構是一樣的,因為他們就是相同的,就是所站的角度不同而已

三 雙向的多對一或一對多

雙向的其實從字面的意思可以看出可以從多的一方查找一的一方,也可以從一的一方查找到多的一方,所對應的實體類是把前邊兩個的結合,映射文件也是

四 一對一(以Person和IdCard為例)

1.一對一是一個人只有一個身份證,而一個身份證只屬於一個人,有了前邊的經驗,一對一的實體類的創建也就是在Person的類中多一個IdCard idCard;屬性,在IdCard的類中多一個Person person;屬性。

2.在Person.hbm.xml映射文件中是:

<one-to-one name="idCard"></one-to-one>

在IdCard.hbm.xml映射文件中是:

<one-to-one name="person"></one-to-one>

五 在測試類中的總結

在測試的時候一般為保存和查詢的操作,分為以下幾種情況:

(1)當是多對一或者是一對多的時候,保存的是向部門中插入的name,和員工中插入的name,員工因為是多個,所以可以插入多個員工,並且把員工設置到Dempartment的對象中,其中對重要的是:

employee1.setDepart(department);

這句話是把兩張表建立起來的

(2)在查詢的時候是調用session的get方法,利用反射就能得到所關聯的對象,例如:

Person person = (Person) session.get(Person.class, personId);

通過調用Person對象person.getIdCard()方法得到IdCard()類

Copyright © Linux教程網 All Rights Reserved