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

Hibernate 新手常見 ID 生成策略錯誤與解決方案

     編輯:程式設計疑難解答

錯誤現象

新手自學 Hibernate 時,儲存實體拋出異常,常見錯誤訊息:

  • ids for this class must be manually assigned before calling save()
  • could not generate identifier
  • IdentifierGenerationException

錯誤截圖1 錯誤截圖2

核心原因:ID 生成策略與資料庫不匹配

常見策略對照表

策略適用資料庫註解/配置說明
identityMySQL, SQL Server, PostgreSQL (SERIAL)@GeneratedValue(strategy = GenerationType.IDENTITY)資料庫自增,插入後回寫 ID
sequenceOracle, PostgreSQL, DB2@SequenceGenerator(name="seq", sequenceName="MY_SEQ")資料庫序列
table所有支援表的資料庫@TableGenerator(name="tab", table="ID_GEN")模擬序列表,效能較差
auto自動選擇@GeneratedValue(strategy = GenerationType.AUTO)Hibernate 決定,可能不符預期
assigned手動指定無 @GeneratedValue業務主鍵 (如 UUID、身分證號)

解決步驟

1. 確認資料庫表結構

-- MySQL
CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);

-- Oracle
CREATE SEQUENCE user_seq;
CREATE TABLE user (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50)
);

2. 實體類別正確配置

// MySQL 自增
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // ...
}

// Oracle 序列
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
    @SequenceGenerator(name = "user_seq", sequenceName = "USER_SEQ", allocationSize = 1)
    private Long id;
    // ...
}

3. hibernate.cfg.xml 關鍵設定

<property name="hibernate.id.new_generator_mappings">true</property>
<!-- true: 使用新生成器 (JPA 標準), false: 舊版相容 -->

避坑檢查清單

  • [ ] 資料庫欄位是否真的是 AUTO_INCREMENT / SEQUENCE
  • [ ] 策略是否與資料庫類型匹配
  • [ ] allocationSize 是否與序列 INCREMENT BY 一致 (預設 50,序列常為 1)
  • [ ] 是否在 @Id 欄位上正確標註 @GeneratedValue
  • [ ] 若用复合主鍵,需實作 Serializable 並覆寫 equals/hashCode

除錯技巧

// 開啟 SQL 顯示
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>

// 觀察實際執行的 INSERT 語句是否包含 ID 欄位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved