2010-03-04 90 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