gpt4 book ai didi

java - Hibernate 在使用序列时生成负 id 值

转载 作者:IT老高 更新时间:2023-10-28 20:56:29 26 4
gpt4 key购买 nike

我有一个具有以下定义的类:

@Id
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID")
@Column(name = "ID")
private long Id;

当我们在 Jboss 4.2.3 上运行它时,它运行良好并生成了正确的 ID(从 1000+ 开始)

现在我们迁移到 jboss 7.1.1,它会生成负 ID! (从-498开始向上)

知道为什么会发生这种情况吗?

最佳答案

新的行为如下:

AllocationSize 是为 Hibernate 保留的主键值范围。并且 select seq.nextval from dual 只会在 hibernate 消耗了这个范围的主键之后才会完成。

所以你必须allocationSize (Hibernate) 和序列 increment by (DB) 上声明相同的值

当显式设置 allocationSize=500 时,例如在甲骨文上

create sequence SEQ_ACE_WORKERS_QUEUE_STATS_ID
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 500
NOCACHE
NOCYCLE;

否则,您会注意到由于主键冲突而从数据库中引发负值或约束错误。

当应用服务器重新启动时,您会注意到分配的最新主键和重新启动时选择的"new"序列号之间的“跳跃”。

最后的注释:默认值为50。所以如果你在Hibernate端没有指定allocationSize,你必须声明increment by数据库端 50 个。

关于java - Hibernate 在使用序列时生成负 id 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com