关于hibernate:自动为非主键列生成数字

 2021-04-27 

auto incremented number generation for a non primary key column

我对主键使用了以下id生成策略。

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

我想对非主键列执行相同的操作。
[a]为此类密钥定义自动生成方案的语义是什么
[b]是否可以保证生成的数字在数字上没有间隙。


如果删除@Id批注,并保留其余注释(当然更改字段名称),那应该可以。

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

通过允许数据库生成列值,您将确保没有间隙,除非删除和回滚。

例如,如果删除表中间的行,则将创建一个不会被填充的空白。


通常,确保自动增加的值始终在增加,但是可能存在间隙。

例如,如果同时发生两次插入并回滚一个事务,则可能会发生间隙(如果数据库要确保没有间隙,则所有事务都需要序列化。)

编辑

从此页面获取的oracle示例:

1
2
3
4
5
CREATE SEQUENCE supplier_seq
    MINVALUE 1
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

对于序列,高速缓存选项指定将在内存中存储多少序列值以加快访问速度。

使用缓存创建序列的不利之处在于,如果发生系统故障,所有未使用的缓存序列值将"丢失"。这样会导致分配的序列值出现"间隙"。当系统重新启动时,Oracle将在序列中从其上次中断的地方开始缓存新的数字,而忽略所谓的"丢失"序列值。