首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Hibernate 雙向關聯與單向關聯:從數據庫外鍵到對象導航的映射邏輯

     編輯:程式設計疑難解答

數據庫層面:外鍵與關聯表

關係類型建模方式外鍵位置
1:1共享主鍵 / 外鍵唯一任意一方
1:N外鍵在 N 端N 端表
N:1同 1:N,視角反轉N 端表
N:M中間表(兩個外鍵組合主鍵)中間表

Hibernate 對象導航映射

  • 單向關聯:僅一方持有引用(如 Teacher → Set<Student>),另一方無導航屬性。映射配置只在持有方(one-to-many 或 many-to-one)。
  • 雙向關聯:雙方均持有引用(Teacher.students + Student.teacher)。**必須指定一邊為關係維護端**(inverse="true"),另一邊負責外鍵更新,否則產生冗餘 UPDATE。

映射配置要點

<!-- Teacher.hbm.xml (1:N 雙向,Teacher 為關係被維護端) -->
<set name="students" inverse="true" cascade="all-delete-orphan">
    <key column="teacher_id"/>
    <one-to-many class="Student"/>
</set>

<!-- Student.hbm.xml (N:1 雙向,Student 為關係維護端) -->
<many-to-one name="teacher" column="teacher_id" not-null="true"/>

核心規則

  1. 關係維護端(owner):many-to-one 所在實體,負責外鍵 INSERT/UPDATE。
  2. inverse="true":告訴 Hibernate「這邊不管外鍵,聽另一邊的」。**集合端通常設 true**。
  3. cascade:all-delete-orphan 刪除 Teacher 時級聯刪除孤兒 Student。
  4. 雙向必雙邊 set/get:teacher.setStudents(stus); stu.setTeacher(teacher); 否則內存對象圖不一致。

常見坑

  • 雙向雙邊都不設 inverse → 雙邊各發一條 UPDATE 外鍵 SQL。
  • 單向 one-to-many 未加 @JoinColumn → Hibernate 創建中間表退化為 N:M。
  • N:M 雙向映射需在一方集合加 inverse="true",中間表由維護端控制。

理解「數據庫外鍵所有權」與「對象導航雙向一致性」的映射關係,是驾馭 Hibernate 關聯的鑰匙。

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