首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate 關聯映射全解析:一對多、一對一、多對多與對象狀態轉換

     編輯:Java 綜合教學

Hibernate 關聯映射全解析:一對多、一對一、多對多與對象狀態轉換

Hibernate 關聯映射通過表設計、實體類、映射文件三位一體實現。本文系統講解三種核心關聯類型的映射配置,並深入解析對象四種狀態及轉換規則。

關鍵映射屬性速查

屬性說明常用值
cascade級聯操作none, save-update, delete, all, all-delete-orphan
inverse關系維護方true(從方維護), false(主方維護,默認)
lazy延遲加載true(默認), false

原則:1-N 中建議 N 方為主控方(inverse="true")提升性能;1 方為主控會產生額外 UPDATE。cascade 優先於 inverse 執行。

一、一對多關聯映射

表設計:多方表添加外鍵關聯一方主鍵。
實體類:

  • OrderItem(1 方):持有 UserOrder 引用
  • UserOrder(N 方):持有 Set<OrderItem> 集合

映射文件:

<!-- OrderItem.hbm.xml 多方 -->
<many-to-one name="userOrder" class="UserOrder" cascade="all" column="order_id"/>

<!-- UserOrder.hbm.xml 一方 -->
<set name="orderItems" cascade="all-delete-orphan" inverse="false" lazy="true">
  <key column="order_id"/>
  <one-to-many class="OrderItem"/>
</set>

二、一對一關聯映射

表設計:主從關系,從表主鍵同時作為外鍵(唯一+非空)。
實體類:Boy、Girl 相互持有引用。
映射文件:

<!-- Boy.hbm.xml 主方 -->
<many-to-one name="girl" class="Girl" cascade="all" lazy="false" unique="true" column="g_id"/>

<!-- Girl.hbm.xml 從方 -->
<one-to-one name="boy" class="Boy" cascade="all" lazy="false"/>

從方共享主鍵,故用 one-to-one 且無需額外外鍵列。

三、多對多關聯映射

表設計:引入中間表(如 stu_course)存儲兩邊主鍵。
實體類:Stu 持有 Set<Course>,Course 無反向引用(單向)。
映射文件:

<!-- Stu.hbm.xml -->
<set name="courses" cascade="all" inverse="false" lazy="false" table="stu_course">
  <key column="s_id"/>
  <many-to-many column="c_id" class="Course"/>
</set>

@JoinTable 定義中間表結構,雙向關聯時另一邊用 mappedBy。

四、Hibernate 對象四大狀態與轉換

狀態特徵典型觸發操作
臨時態OID 為 null,無 Session 緩存,無數據庫記錄new Entity()
持久態OID 非 null,在 Session 緩存,與數據庫記錄對應,事務提交自動同步save(), get(), load()
游離態OID 非 null,脫離 Session 緩存,數據庫可能有對應記錄session.close(), evict(), clear()
刪除態OID 非 null,從 Session 移除,計劃執行 DELETEdelete()

狀態轉換圖:

對象狀態轉換圖 狀態轉換補充

掌握狀態轉換是正確使用 Session 方法(save/update/merge/lock/delete)的前提,避免非預期的數據庫操作或異常。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved