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

Hibernate 單向多對一映射與主鍵生成策略坑點實錄

     編輯:Java 綜合教學

關聯關係建模

資料表:GRADE(一方) ← STUDENT(多方),學生表含外鍵 GRADE 關聯班級。

實體類:

  • Grade:gid、gname、gdesc
  • Student:sid、sname、sex、Grade grade(物件引用)

映射檔重點

Grade.hbm.xml

<id name="gid"><generator class="increment"/></id>
<property name="gname"/>
<property name="gdesc"/>

Student.hbm.xml(多方配置關聯)

<id name="sid"><generator class="increment"/></id>
<property name="sname"/>
<property name="sex"/>
<many-to-one name="grade" class="com.zzh.entity.Grade" fetch="join">
    <column name="GRADE"/> <!-- 外鍵欄位 -->
</many-to-one>

name 對應 Student 中的屬性名,column 對應資料表外鍵欄位。

通用 DAO 實作(含反射)

public Object findById(int id, Object obj) {
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    try {
        // 利用 obj.getClass() 取得實際類別,實現通用查詢
        obj = session.get(obj.getClass(), id);
        tx.commit();
    } catch (Exception e) { e.printStackTrace(); }
    finally { HibernateUtil.closeSession(session); }
    return obj;
}

關鍵:obj.getClass() 等同於 Student.class,利用反射實現單一 DAO 處理多實體。

主鍵生成策略實測坑點

策略現象原因/解決
assigned(工具預設)Duplicate entry '0' for key 'PRIMARY'程式需手動設 ID,否則全為 0。不推薦自動建表時使用。
identityField 'SID' doesn't have a default value資料庫欄位需設 AUTO_INCREMENT。
increment正常運行Hibernate 內存計數,單例安全,多實例會重複。適合開發/測試。

總結

  • 單向多對一只在「多」方配置 <many-to-one>。
  • 工具生成映射檔預設 assigned,需手動改為 increment 或 identity。
  • 通用 DAO 利用反射 obj.getClass() 簡化程式碼。
  • 主鍵策略選擇需考慮:單機/叢集、資料庫支援度、效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved