| 關係類型 | 建模方式 | 外鍵位置 |
|---|---|---|
| 1:1 | 共享主鍵 / 外鍵唯一 | 任意一方 |
| 1:N | 外鍵在 N 端 | N 端表 |
| N:1 | 同 1:N,視角反轉 | N 端表 |
| N:M | 中間表(兩個外鍵組合主鍵) | 中間表 |
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"/>
many-to-one 所在實體,負責外鍵 INSERT/UPDATE。all-delete-orphan 刪除 Teacher 時級聯刪除孤兒 Student。teacher.setStudents(stus); stu.setTeacher(teacher); 否則內存對象圖不一致。inverse → 雙邊各發一條 UPDATE 外鍵 SQL。one-to-many 未加 @JoinColumn → Hibernate 創建中間表退化為 N:M。inverse="true",中間表由維護端控制。理解「數據庫外鍵所有權」與「對象導航雙向一致性」的映射關係,是驾馭 Hibernate 關聯的鑰匙。