首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Hibernate 在 MySQL 中配置主鍵自增策略的正確姿勢

     編輯:程式設計綜合問答

問題背景

在使用 Oracle 時,只需在實體類的主鍵字段上加上 @GeneratedValue 註解,新增數據時即可自動生成主鍵。但項目遷移到 MySQL 後,同樣的配置卻拋出異常:

java.sql.SQLException: Field '***' doesn't have a default value

原始代碼如下:

@Id
@GeneratedValue
@Column(name = "rol_id")
private Long rolId; // ID

網上常見的「速成」方案

許多開發者通過搜索找到如下配置,確能解決報錯:

@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "increment")
@Column(name = "rol_id")
private Long rolId; // ID

這樣設置後主鍵確實表現為自增,但其中原理往往不清不楚,且 increment 策略在高併發環境下存在安全隱患。

完美解決方案:使用原生身份標識策略

針對 MySQL 自增主鍵,最標準、最高效的方式是使用 GenerationType.IDENTITY,讓數據庫自行維護自增列:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "rol_id")
private Long rolId;

為什麼這才是正解?

  • 語義明確:直接映射到 MySQL 的 AUTO_INCREMENT 列,由數據庫保證唯一性與順序性。
  • 效能最優:無需額外查詢或鎖表,插入性能最接近原生 SQL。
  • 避免併發問題:increment 策略在應用層維護計數器,多實例部署時極易產生重複鍵。

補充:其他常見策略對比

策略適用場景優缺點
AUTO跨數據庫項目由 Hibernate 自動選擇,可能退化為 TABLE 策略,效能一般
SEQUENCEOracle、PostgreSQL 等支持序列的數據庫需額外創建序列對象,MySQL 不支持
TABLE不支持自增/序列的數據庫通過模擬序列表實現,需行鎖,吞吐量低
UUID分布式系統、需全局唯一標識長度較大(36字符),索引性能較差,不利於範圍查詢

最佳實踐建議

  1. MySQL 自增主鍵**首選 GenerationType.IDENTITY**。
  2. 實體類主鍵類型建議使用包裝類 Long 而非基本類型 long,便於判斷是否為新對象(id == null)。
  3. 若項目需兼容多種數據庫,可在配置文件中通過 hibernate.id.new_generator_mappings 統一管理策略。

掌握正確的主鍵生成策略,不僅能解決報錯,更能為系統的高併發穩定運行打下基礎。

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