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

Hibernate 映射錯誤:Set 集合屬性缺少 Getter/Setter 或映射配置錯誤

     編輯:程式設計綜合問答

錯誤現象

啟動專案拋出異常,提示 `Teacher` 類別的 `list_courses` 屬性找不到 Getter/Setter,或映射配置錯誤。初學者檢查實體類發現 Getter/Setter 明明寫了,百思不得其解。

常見原因排查

1. 實體類 Getter/Setter 命名不規範

Hibernate 預設依 **JavaBeans 規範** 透過反射尋找存取器:

  • 欄位 `private Set list_courses;`
  • Getter **必須**為 `public Set getList_courses()` (注意 `L` 大寫) 或 `public Set getListCourses()` (駝峰)。
  • Setter **必須**為 `public void setList_courses(Set list_courses)`。

常見錯誤:寫成 `getList_courses()` (小寫 l) 或 `getListCourses()` 但欄位名不匹配,導致反射找不到。

2. .hbm.xml 映射檔配置錯誤

單向一對多關聯正確配置:


<!-- Teacher.hbm.xml -->
<class name="cn.pj.zyf.domain.Teacher" table="teacher">
    <id name="tid" column="tid">
        <generator class="assigned"/>
    </id>
    <property name="tname" column="tname"/>
    <property name="pic" column="pic"/>
    <property name="description" column="description"/>
    
    <!-- 一對多:Teacher 1 -- N Course -->
    <set name="list_courses" table="course" lazy="true" cascade="all-delete-orphan">
        <key column="teacher_id"/> <!-- 外鍵欄位在 course 表 -->
        <one-to-many class="cn.pj.zyf.domain.Course"/>
    </set>
</class>

關鍵屬性:

  • `name="list_courses"`:**必須與實體類屬性名完全一致** (含底線、大小寫)。
  • `table="course"`:關聯表名。
  • `key column="teacher_id"`:外鍵欄位 (在多方表)。
  • `cascade="all-delete-orphan"`:級聯操作 (視業務需求)。

3. Course 端映射 (雙向關聯時必須)


<class name="Course" table="course">
    <id name="cid" column="cid"><generator class="native"/></id>
    <property name="cname" column="cname"/>
    <many-to-one name="teacher" class="Teacher" column="teacher_id" not-null="true"/>
</class>

若為雙向,`Teacher` 端 `` 需加 `inverse="true"`,由 `Course` 端維護關係。

4. 欄位型別與泛型

建議宣告介面型別:


private Set list_courses = new HashSet<>(); // 初始化避免 NPE
public Set getList_courses() { return list_courses; }
public void setList_courses(Set list_courses) { this.list_courses = list_courses; }

除錯步驟

  1. 確認實體類 `getList_courses`/`setList_courses` 簽名與屬性名 `list_courses` **完全一致** (大小寫、底線)。
  2. 檢查 `.hbm.xml` 中 `` 是否拼寫正確。
  3. 確認 `Course.hbm.xml` 存在且 `` 的 `column` 指向正確外鍵欄位。
  4. 啟動時觀察 Hibernate 輸出的 SQL,驗證關聯查詢是否正確。

結論

Hibernate 映射錯誤 90% 來自 **屬性名/Getter/Setter 命名不一致** 或 **`.hbm.xml` 中 `name`/`column` 拼寫錯誤**。嚴格遵循 JavaBeans 命名慣例、使用 IDE 產生 Getter/Setter、仔細核對映射檔,即可避免此類低級錯誤。

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