@GeneratedValue 定義主鍵值產生方式,搭配 strategy 指定標準策略,或配合 @GenericGenerator 使用 Hibernate 原生生成器。
| 策略 | 適用資料庫 | 說明 |
|---|---|---|
AUTO | 通用 | 由持久化提供者自動選擇 (通常為 IDENTITY 或 SEQUENCE) |
IDENTITY | MySQL, SQL Server, PostgreSQL, DB2 | 資料庫自增欄位,插入後取回生成值 |
SEQUENCE | Oracle, PostgreSQL, DB2, H2 | 使用資料庫 Sequence 物件 |
TABLE | 通用 | 使用模擬序列表 (hibernate_sequences) 產生 ID,跨資料庫可攜 |
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_gen")
@SequenceGenerator(name = "seq_gen", sequenceName = "SEQ_USER", allocationSize = 1)
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "tbl_gen")
@TableGenerator(name = "tbl_gen", table = "ID_GEN", pkColumnName = "GEN_KEY", valueColumnName = "GEN_VALUE", pkColumnValue = "USER_ID")
private Long id;
若需使用 UUID、GUID、HiLo 等非標準策略,需配合 @GenericGenerator:
@Id
@GeneratedValue(generator = "uuid_gen")
@GenericGenerator(name = "uuid_gen", strategy = "uuid2") // 或 uuid.hex, guid, assigned 等
private String id;
uuid2 (標準 UUID, IETF RFC 4122)uuid.hex (16進位字串,已棄用建議用 uuid2)guid (資料庫特定 GUID,如 SQL Server NEWID)assigned (應用程式手動指派)identity, sequence, seqhilo, hilo, incrementforeign (一對一共用主鍵)sequence-identity (PostgreSQL 專用)多實體共用同一生成器實例 (如共用 Sequence):
// 實體 A
@GeneratedValue(generator = "shared_seq")
@SequenceGenerator(name = "shared_seq", sequenceName = "GLOBAL_SEQ")
// 實體 B
@GeneratedValue(generator = "shared_seq")
@SequenceGenerator(name = "shared_seq", sequenceName = "GLOBAL_SEQ")
IDENTITY 策略下 persist() 會立即執行 INSERT,無法批次插入 (batch insert 失效)。SEQUENCE 建議設定 allocationSize (預設 50) 減少資料庫往返,但需與資料庫 Sequence INCREMENT BY 一致。@IdClass/@EmbeddedId) 通常不適用自動生成策略。