Firebird 無原生自增欄位(如 MySQL AUTO_INCREMENT、SQL Server IDENTITY),需結合 序列產生器 與 觸發器 實現:
CREATE GENERATOR my_generatorCREATE 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
在 .hbm.xml 的 <id> 元素中,使用 increment 產生器策略:
<id name="id" column="my_number">
<generator class="increment"/>
</id>
increment 產生器由 Hibernate 在記憶體中維護計數器,適合單一進程應用increment 不支援叢集,多節點會產生重複 ID。叢集環境請改用 sequence 策略(需資料庫支援序列)或 native 策略GEN_ID(generator, step) 的 step 參數通常為 1BEFORE INSERT 確保 ID 在插入前就緒NOT NULL若 Firebird 版本支援標準 SQL 序列(Firebird 3.0+),可直接使用:
<generator class="sequence">
<param name="sequence">my_generator</param>
</generator>
此方式更標準、支援叢集,為現代應用首選。