我对主键使用了以下id生成策略。
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;
我想对非主键列执行相同操作。 [a]为这样的密钥定义自动生成方案的语义是什么 [b]是否保证生成的数字不会有数字缺口。
答案 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;
});
},