資料表:GRADE(一方) ← STUDENT(多方),學生表含外鍵 GRADE 關聯班級。
實體類:
Grade:gid、gname、gdescStudent:sid、sname、sex、Grade grade(物件引用)<id name="gid"><generator class="increment"/></id> <property name="gname"/> <property name="gdesc"/>
<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 對應資料表外鍵欄位。
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。不推薦自動建表時使用。 |
| identity | Field 'SID' doesn't have a default value | 資料庫欄位需設 AUTO_INCREMENT。 |
| increment | 正常運行 | Hibernate 內存計數,單例安全,多實例會重複。適合開發/測試。 |
<many-to-one>。assigned,需手動改為 increment 或 identity。obj.getClass() 簡化程式碼。