首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Hibernate hbm.xml generator 節點主鍵生成策略詳解與常見坑

     編輯:Oracle 教學

常用 generator class 屬性值

策略適用資料庫說明
assigned所有應用程式自行指定主鍵值(save() 前必須 setId)
sequenceOracle, PostgreSQL, DB2使用 Sequence 產生,需在 指定序列名
increment所有在記憶體中自增(max+1),僅適單進程/單節點,叢集環境不可用
identityMySQL, SQL Server, Sybase依賴資料庫自增欄位,Oracle 12c 前不支援
native所有由 Hibernate 依 Dialect 自動選擇 sequence/identity/increment
uuid / guid所有產生 32 位 UUID,適合分散式系統

常見錯誤場景

1. assigned 但未設值

Exception: ids for this class must be manually assigned before calling save()

解決:entity.setId(value) 後再 save()。

2. increment 用於空表

Hibernate 會先 SELECT MAX(id) FROM table,空表回傳 NULL → 轉為 0 → 嘗試 INSERT id=0 → 若主鍵為 NOT NULL 可能成功,但並發極易重複。

解決:

  • 改用 sequence(需建立 Sequence)。
  • 或確保表已有資料再用 increment。
  • 生產環境嚴禁使用 increment。

最佳實務建議

  1. Oracle:優先 sequence,搭配 allocationSize 優化效能。
  2. MySQL/PostgreSQL:使用 identity 或 native。
  3. 分散式/微服務:uuid 或 guid 避免協調成本。
  4. 避免 increment、native 在叢集環境產生衝突。

範例配置

<id name="id" type="long">
  <generator class="sequence">
    <param name="sequence">SEQ_STUDENT</param>
  </generator>
</id>

<id name="id" type="string">
  <generator class="uuid"/>
</id>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved