非主键列的自动递增数字生成

时间:2010-03-04 13:25:36

标签: hibernate jpa

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

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

我想对非主键列执行相同操作。         [a]为这样的密钥定义自动生成方案的语义是什么         [b]是否保证生成的数字不会有数字缺口。

3 个答案:

答案 0 :(得分:1)

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

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

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

例如,如果删除表格中间的行,则会产生无法填充的空白。

答案 1 :(得分:1)

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

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

修改

this page获取的oracle示例:

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

对于序列,cache选项指定将在内存中存储多少个序列值以便更快地访问。

使用缓存创建序列的缺点是,如果发生系统故障,所有未使用的缓存序列值将“丢失”。这导致分配的序列值中的“间隙”。当系统恢复时,Oracle将从序列中的位置缓存新数字,忽略所谓的“丢失”序列值。

答案 2 :(得分:0)

我使用 @Column 注释中的 columnDefinition 属性解决了这个问题。

onChanged: (String? userchoice){
             setState(() {
               this._currentGadgets = userchoice;
             });
           },