Hibernate12-Hibernate 關聯關系

建立關聯關系,hibernate可以快速的查詢出我們想要的信息,例如 員工表與部門表創建了關聯關系,那我我們可以通過員工來查詢出部門,也可以通過部門來查詢出,部門下所有的員工。如果不盡力關系,我們叫要通過手動去寫Hql語句,進行表連接查詢,而建立關系后Hibernate就自動為我們生成了表連接查詢Hql語句了。

其實創建關聯很簡單,只要弄明白表和表之間的關聯就可以了。
例如,我有一張員工表(EMP)和一張部門表(DEPT)

EMP
DEPT

在EMP表中有一列是外鍵DEPTNO這一列,與DEPT表的主鍵建立主外鍵關系,那么我們可以想一下EMP表與DEPT表在Hibernate中要如何創建關聯關系。
1.一個部門下面可以有多個員工。
2.一個員工屬于一個部門。
根據這兩點,我們可以判斷出
1.員工與部門是多對一的關系。因為一個員工屬于一個部門,但是一個部門下有多個員工。
2.部門與員工是一對多的關系。因為一個部門有N個員工。

如果還不理解可以想想公司,公司內有領導和員工,多個員工對應著一個領導,一個領導對應著多個員工。
注:只要能搞清楚表和表之間的關系,就可以很好的來配置Hibernate的關聯關系。

配置雙向一對多關聯
注:既然是雙向關聯,“一對多雙向關聯”和“多對一雙向關聯”是完全一樣的,只是習慣上稱為一對多雙向關聯。在員工表(EMP)的映射文件中使用<many-to-one>元素創建多對一關聯。
<many-to-one
name="dept" column="DEPTNO"
class="com.entity.Dept">
name:代表class元素中name屬性指定的持久化類中的屬性。
column:代表class元素中table屬性指定表中的列。
class:指定要創建關聯關系的類。

Hibernate會自動獲取dept屬性的值,然后去對應class設置類中的主鍵去找到相關的信息。

在部門表(DEPT)中創建一對多關聯注:創建一對多關聯,表明通過部門查找所有員工,而員工有N個,所以要定義一個集合屬性,Hibernate推薦使用set集合。

使用<set>元素創建一對多關聯。這里的set是元素,是hibernate定義的元素標簽,而不是Java中的set接口。

<set name="emps">//Dept表中的emps屬性 <key column="DEPTNO"></key>//下面class屬性設置Emp持久化類對應emp表的DEPTNO列,此列是外鍵 <one-to-many class="con.entity.Emp" />//設置持久化類</set>可以理解成Hibernate拿著Dept類中的主鍵,去找Emp表的外鍵,找到后放到emps集合中。

注:因為Dept類和Emp表都建立了關聯關系所以是雙向的,如果其中一個表建立了關聯關系則為單向關聯關系。

set元素常用屬性
inverse="true|false":直譯為反轉。在關聯關系中false為主動方,由主動方負責維護關聯關系。

在一對多關聯中,通常設置one方。以員工表和部門表為例,如果使用默認值false則當刪除部門的時候,會執行一條update語句將員工表中外鍵全部設置為null,如果設置為true,并且在表中又建立了主外鍵關系,當刪除部門數據的時候會出錯,否則只會刪除部門表中的數據,而不會執行update語句。

fetch="select /join/subselect":抓取策略默認為select,例如我們只查詢部門,這個時候只會查詢部門的數據,而不會查詢部門下有那些員工。只有當我們用到emps這個數據的時候才會發送sql語句去查詢。
join,當我們查詢部門信息的時候,hibernate會將部門下的所有員工都查詢出來。

cascade屬性
none:默認值,當Session操縱當前對象時,忽略其他關聯的對象。
save-update:當通過session的save()、update()及saveOrUpdate方法類保存或更新對象時,級聯保存。
delete:當通過Session的delete()方法刪除當前對象時,會級聯刪除所有關聯對象。
例如刪除部門表中的數據,那么也會刪除對應的員工表中的數據。all:包含save-update、delete行為。

order-by:用于在數據庫中對集合排序可以對查詢出來的員工信息根據某一列進行排序。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容