Herbinet 实体类Entity 主键ID 实现支持Oracle自增序列allocationSize 属性的坑

场景:
Hibernet 实体类 支持Oracle数据库主键自增代码如下:

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "***_SEQ")
    @SequenceGenerator(name = "****_SEQ", sequenceName = "***_SEQ")
    public Long getId() {
        return this.id;
    }

此处只指定了序列名称,@SequenceGenerator 却少了allocationSize 属性
关于该注释的俩属性:
initialValue属性:该序列的起始值。

allocationSize属性:每次增长的递增量,默认为50.,必须与oracle序列表的步长一致

如果不设置allocationSize 属性的话,导致的问题:
每个客户端新增记录的时候,采用的自增ID 都是采用本地缓存的记录为准实现自增,比如:
A 客户端新增记录 ID 为100,101,102,下次A客户再新增,便会从103开始
B 客户端新增记录 ID 为103,104,105,下次B客户再新增,便会从106开始

而当A客户下次新增的时候,下一个值是A客户端本地缓存的102的基础+1,为103,而不是以数据库的最大ID为准,所以A客户再新增记录,便会添加103,但是103已经被B客户端添加过,导致违反唯一约束索引;

正确的ID 配置注解写法:

@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "***_SEQ")
    @SequenceGenerator(name = "***_SEQ", sequenceName = "***_SEQ",allocationSize =1)
    public Long getId() {
        return this.id;
    }

你可能感兴趣的:(java,数据库)