最近遇到一个问题,oracle数据库中出现了这样的数据:
按照时间倒序查询,发现主键竟然是跳跃的,序列的下一个值是4129。
经过一番探索 结论如下:
4000多的id是手机端产生的数据,200000以上的id是web端产生的数据,web端用的hibernate框架,其中的实体类的主键这样定义的:
@SequenceGenerator(name = "generator", sequenceName = "DANGER_DANGER_SEQ")
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "generator")
@Column(name = "DANGER_ID", unique = true, nullable = false, precision = 16, scale = 0)
public Long getDangerId() {
return this.dangerId;
}
关键在这里 @SequenceGenerator 注解的属性缺少了一项:allocationSize=1
正确完整的写法是:
@SequenceGenerator(name = "generator", sequenceName = "DANGER_DANGER_SEQ",allocationSize=1)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "generator")
@Column(name = "DANGER_ID", unique = true, nullable = false, precision = 16, scale = 0)
public Long getDangerId() {
return this.dangerId;
}
这样才不会出现主键跳跃的情况