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

Hibernate 主鍵生成策略完全指南:從 assigned 到 native 的選型之道

     編輯:Java 相關知識

主鍵設計是資料庫建模的核心決策。Hibernate 提供豐富的主鍵生成策略(Generator),抽象化不同資料庫的自增機制(SQL Server IDENTITY、MySQL AUTO_INCREMENT、Oracle SEQUENCE),讓應用程式碼不受底層資料庫綁定。

自然主鍵 vs 代理主鍵

  • 自然主鍵:具業務意義(如身分證字號),但業務變更可能導致主鍵異動,不推薦
  • 代理主鍵:無業務意義的流水號(如 user_id),穩定不變,為主流選擇

常用 Generator 詳細比較

策略名稱適用資料庫運作機制優點缺點/限制
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;

選型決策樹

  1. 是否為自然主鍵?→ assigned
  2. 目標資料庫固定為 SQL Server/MySQL?→ identity
  3. 目標資料庫固定為 Oracle/PostgreSQL?→ sequence
  4. 需跨資料庫部署?→ native(推薦預設值)
  5. 分散式系統、離線同步?→ uuid

效能與併發建議

  • 避免 increment 用於生產環境:併發下極易產生重複鍵
  • 大量批次插入:偏好 sequence(可預取 ID 批次寫入)或 identity 搭配 jdbc.batch_size
  • Oracle 使用 sequence 時,設定 allocationSize 減少資料庫往返
  • MySQL 8.0+ 支援 AUTO_INCREMENT 間隙鎖優化,identity 表現優異

總結

native 是最安全的預設選擇,但理解底層實際機制(identity vs sequence)對效能調校至關重要。現代應用傾向使用 IDENTITY(MySQL/SQL Server)或 SEQUENCE(Oracle/PostgreSQL)明確宣告,配合 allocationSize 優化批次寫入效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved