2010-03-04 93 views
3

我對主鍵使用了以下ID生成策略。非主鍵列的自動遞增數字生成

@Id 
     @GeneratedValue(strategy = IDENTITY) 
     @Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false) 
     private Integer id; 

我想對非主鍵列做同樣的事情。 [a]定義這種密鑰的自動生成方案的語義是什麼 [b]是否保證生成的數字不會有數字間的差距。

回答

1

如果您刪除@Id註釋,並保留其餘(更改字段名稱當然),應該工作。

@GeneratedValue(strategy = IDENTITY) 
    @Column(name = "columnName", unique = true, nullable = false, insertable = false, updatable = false) 
    private Integer columnName; 

通過允許數據庫生成列值,您將確保沒有空白,除了刪除和回滾的情況。例如,如果您刪除表格中間的行,那麼會創建一個不會被填充的空白。

+1

數據庫不提供這種保證 - 他們只提供越來越多的唯一編號 – ewernli 2010-03-04 13:33:50

+0

@ewernli,這是一個很好的觀點,我糾正了我的答案。 – 2010-03-04 13:37:02

+1

我很好奇:我可以在主鍵以外的某些屬性中使用@GeneratedValue(SEQUENCE),它的值將會生成嗎? – 2010-03-04 13:58:34

1

正常情況下,自動遞增值確保始終爲增加,但是可能存在差距。如果兩個刀片同時發生

差距可​​能發生,一個事務回滾,例如(如果數據庫是確保沒有縫隙,所有的交易都需要被序列化。)

編輯

實施例爲Oracle從this page採取:

CREATE SEQUENCE supplier_seq 
    MINVALUE 1 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 20; 

對於一個序列中,高速緩存選項指定的序列值會多少是STO在內存中紅色更快訪問。

使用緩存創建序列的缺點是,如果發生系統故障,所有未使用的緩存序列值將「丟失」。這會導致分配的序列值出現「間隙」。當系統恢復時,Oracle會從序列中的剩餘位置緩存新數字,忽略所謂的「丟失」序列值。

+0

我對Oracle不熟悉。如果您不創建緩存會發生什麼? – 2010-03-04 13:45:00

+0

本頁討論帶緩存和無緩存的序列http://www.arikaplan.com/oracle/ari82599.html。無論如何,只是要指出,有些東西不在hibernate的手中,而是處於數據庫級別,因此可能是數據庫特定的,除非您完全控制數字在應用級別生成和使用的方式。 – ewernli 2010-03-04 14:41:33