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

Hibernate 從入門到精通(八):一對多單向關聯映射詳解

     編輯:Java 相關知識

前言

承接多對一單向關聯,本文解析一對多單向關聯。核心差異:維護「一指向多」的導航,在「一的一方」配置集合。

領域模型

public class Classes { // 一的一方,持有集合
    private int id;
    private String name;
    private Set students;
    // getter/setter
}

public class Student { // 多的一方,無引用
    private int id;
    private String name;
    // getter/setter
}

對比:一對多 vs 多對一

維度多對一一對多
導航方向多 → 一一 → 多
外鍵位置多的一方表多的一方表 (相同)
映射標籤<many-to-one><one-to-many> (在 <set> 內)
資料庫結構相同相同

本質:若將集合視為整體,一對多與多對一在資料庫層面完全對稱,僅導航方向不同。

資料庫結構

表欄位
t_classesid (PK), name
t_studentid (PK), name, classesid (FK)

映射配置 (hbm.xml)

<class name="com.zs.hibernate.Classes" table="t_classes">
  <id name="id"><generator class="native"/></id>
  <property name="name"/>
  <set name="students"> <!-- 無 inverse -->
    <key column="classesid"/>
    <one-to-many class="com.zs.hibernate.Student"/>
  </set>
</class>

<class name="com.zs.hibernate.Student" table="t_student">
  <id name="id"><generator class="native"/></id>
  <property name="name"/>
  <!-- 無 many-to-one -->
</class>

單向缺陷:關鍵痛點

  1. 保存 Student 時外鍵為 null:因 Student 無 classes 引用,Hibernate 不知道屬於哪個 Classes,INSERT 時 classesid 為 null,若資料庫設 NOT NULL 會拋異常
  2. 無法從 Student 導航到 Classes:業務查詢「學生所屬班級」需額外 DAO 查詢
  3. 級聯刪除風險:若配置 cascade="delete",刪除 Classes 會連帶刪除所有 Student,單向無法精細控制

解決之道:升級為雙向

在 Student 加入 Classes classes 欄位與 <many-to-one> 映射,即為下篇「一對多雙向關聯」。

註解配置對照

@Entity @Table(name="t_classes")
public class Classes {
    @OneToMany
    @JoinColumn(name="classesid") // 指定外鍵欄位在 Student 表
    private Set students = new HashSet<>();
}

@Entity @Table(name="t_student")
public class Student {
    // 無註解,純被動
}

下一步預告

下篇講解一對多雙向關聯:加入 many-to-one、設定 inverse="true"、雙向同步最佳實踐。

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