| 策略 | 適用資料庫 | 說明 |
|---|---|---|
| assigned | 所有 | 應用程式自行指定主鍵值(save() 前必須 setId) |
| sequence | Oracle, PostgreSQL, DB2 | 使用 Sequence 產生,需在 指定序列名 |
| increment | 所有 | 在記憶體中自增(max+1),僅適單進程/單節點,叢集環境不可用 |
| identity | MySQL, SQL Server, Sybase | 依賴資料庫自增欄位,Oracle 12c 前不支援 |
| native | 所有 | 由 Hibernate 依 Dialect 自動選擇 sequence/identity/increment |
| uuid / guid | 所有 | 產生 32 位 UUID,適合分散式系統 |
Exception: ids for this class must be manually assigned before calling save()
解決:entity.setId(value) 後再 save()。
Hibernate 會先 SELECT MAX(id) FROM table,空表回傳 NULL → 轉為 0 → 嘗試 INSERT id=0 → 若主鍵為 NOT NULL 可能成功,但並發極易重複。
解決:
sequence(需建立 Sequence)。sequence,搭配 allocationSize 優化效能。identity 或 native。uuid 或 guid 避免協調成本。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>