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

Hibernate 與 Firebird 自增欄位映射實作指南

     編輯:Java 相關知識

Firebird 自增機制原理

Firebird 無原生自增欄位(如 MySQL AUTO_INCREMENT、SQL Server IDENTITY),需結合 序列產生器 與 觸發器 實現:

  1. 建立序列產生器:CREATE GENERATOR my_generator
  2. 建立 BEFORE INSERT 觸發器,若新資料 ID 為 NULL 則從序列取值

完整 DDL 範例

CREATE TABLE my_table (
  my_number INTEGER NOT NULL PRIMARY KEY
);

CREATE GENERATOR my_generator;

CREATE TRIGGER my_before_trigger FOR my_table
BEFORE INSERT
AS
BEGIN
  IF (NEW.my_number IS NULL) THEN
    NEW.my_number = GEN_ID(my_generator, 1);
END

Hibernate 映射配置

在 .hbm.xml 的 <id> 元素中,使用 increment 產生器策略:

<id name="id" column="my_number">
  <generator class="increment"/>
</id>

原理說明

  • increment 產生器由 Hibernate 在記憶體中維護計數器,適合單一進程應用
  • 資料庫端觸發器確保即使繞過 Hibernate 直接插入資料,ID 仍能自動產生
  • 雙重保障:Hibernate 分配 ID → 觸發器檢測非 NULL 直接使用;若 Hibernate 未分配 → 觸發器從序列取值

注意事項

  • 叢集環境:increment 不支援叢集,多節點會產生重複 ID。叢集環境請改用 sequence 策略(需資料庫支援序列)或 native 策略
  • GEN_ID(generator, step) 的 step 參數通常為 1
  • 觸發器需設為 BEFORE INSERT 確保 ID 在插入前就緒
  • 主鍵欄位建議定義為 NOT NULL

替代方案:sequence 策略

若 Firebird 版本支援標準 SQL 序列(Firebird 3.0+),可直接使用:

<generator class="sequence">
  <param name="sequence">my_generator</param>
</generator>

此方式更標準、支援叢集,為現代應用首選。

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