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。
| 狀態 | 特徵 | 典型觸發操作 |
|---|---|---|
| 臨時態 | OID 為 null,無 Session 緩存,無數據庫記錄 | new Entity() |
| 持久態 | OID 非 null,在 Session 緩存,與數據庫記錄對應,事務提交自動同步 | save(), get(), load() |
| 游離態 | OID 非 null,脫離 Session 緩存,數據庫可能有對應記錄 | session.close(), evict(), clear() |
| 刪除態 | OID 非 null,從 Session 移除,計劃執行 DELETE | delete() |
狀態轉換圖:
掌握狀態轉換是正確使用 Session 方法(save/update/merge/lock/delete)的前提,避免非預期的數據庫操作或異常。