我在以下代码中设置了artistId:
@Id @SequenceGenerator( name = "artist_sequence", sequenceName = "artist_sequence", allocationSize = 1 ) @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "artist_sequence" ) private Long artistId;
有人可以向我解释为什么我的 ArtistId 有时会跳过值并且乱序吗?我注意到,即使我尝试将无效的数据插入表中(抛出异常时),该数据也会被表条目拒绝,但我的artistId将被无形地填充。这使我的表格处于以下状态:
artist_id | 名字 | 姓氏 |
---|---|---|
1 | 马歇尔 | 马瑟斯 |
3 | 图帕克 | 沙库尔 |
正如我所说,我的 ArtistId 值 2 被跳过,因为我尝试插入已经存在的艺术家,但我设置它必须是唯一的。因此,异常被抛出,数据被拒绝,但我的值为 2 的 id 被以某种方式填充(或者被跳过)。你们能帮我吗,我该如何解决这个问题以避免这种情况?
听起来您正在使用 Oracle 数据库。 ID 是在插入之前生成的,因此如果插入失败,ID 就会丢失。此外,当使用服务器集群时,ID 范围会分配给每个服务器,并且在连续插入之间可能会有很大差异。 简短的回答是,您不能依赖 ID 是连续且没有缺失值的。这很可能适用于其他数据库。
这几乎是正常行为。
序列生成器的唯一职责是生成不同的整数值,仅此而已。