主鍵設計是資料庫建模的核心決策。Hibernate 提供豐富的主鍵生成策略(Generator),抽象化不同資料庫的自增機制(SQL Server IDENTITY、MySQL AUTO_INCREMENT、Oracle SEQUENCE),讓應用程式碼不受底層資料庫綁定。
user_id),穩定不變,為主流選擇| 策略名稱 | 適用資料庫 | 運作機制 | 優點 | 缺點/限制 |
|---|---|---|---|---|
assigned |
所有 | 應用程式手動指定 | 完全控制,適用自然主鍵 | 需自行查重,效能差,不適用自增欄位 |
increment |
所有 | Hibernate 查詢 MAX(id) + 1 | 無需資料庫支援自增 | 1. 查詢 MAX 影響效能 2. 僅支援 int/long 3. 併發下極易衝突(不安全) |
identity |
SQL Server、MySQL、DB2、Sybase | 資料庫自增欄位(IDENTITY/AUTO_INCREMENT) | 資料庫原生支援,併發安全 | 不支援 Oracle(無 IDENTITY);批次插入無法取回 ID |
sequence |
Oracle、PostgreSQL、DB2、Firebird | 資料庫 Sequence 物件 | 併發安全,支援批次插入預取 ID | MySQL、SQL Server 不支援 Sequence |
native |
所有 | 依資料庫方言自動選擇 identity/sequence/hilo | 跨資料庫可攜性最佳 | 行為隱性,需理解底層實際機制 |
hilo |
所有 | High/Low 演算法,需額外表儲存 hi value | 純資料表實作,無需資料庫特殊功能 | 配置複雜,現已較少使用 |
uuid/guid |
所有 | 生成 UUID/GUID 字串 | 全域唯一,分散式系統友善 | 佔空間大(36 chars),非人類可讀,索引效能較差 |
<id name="id" type="java.lang.Long">
<column name="USER_ID" />
<generator class="native" />
</id>
或使用 Annotation(JPA 標準):
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 或 SEQUENCE, TABLE, AUTO
@Column(name = "USER_ID")
private Long id;
assignedidentitysequencenative(推薦預設值)uuidincrement 用於生產環境:併發下極易產生重複鍵sequence(可預取 ID 批次寫入)或 identity 搭配 jdbc.batch_sizesequence 時,設定 allocationSize 減少資料庫往返AUTO_INCREMENT 間隙鎖優化,identity 表現優異native 是最安全的預設選擇,但理解底層實際機制(identity vs sequence)對效能調校至關重要。現代應用傾向使用 IDENTITY(MySQL/SQL Server)或 SEQUENCE(Oracle/PostgreSQL)明確宣告,配合 allocationSize 優化批次寫入效能。