休眠在使用序列时生成负 ID 值

2022-08-31 21:08:42

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

@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开始上升)

任何想法为什么会发生这种情况?


答案 1

新行为如下:

AllocationSize 是为休眠保留的一系列主键值。并且只有在休眠消耗此范围的主键后,才会从双键中进行选择。seq.nextval

因此,您必须在(休眠)和序列(DB)上声明相同的值allocationSizeincrement by

当显式设置时,例如在 Oracle 上allocationSize=500

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

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

重新启动应用服务器时,您会注意到在分配的最新主键与重新启动时选择的“新”序列号之间存在“跳转”。

最后注释:默认值为 50。因此,如果未在休眠端指定,则必须在数据库端声明 50。allocationSizeincrement by


答案 2

我刚刚在从 JBoss 6.1 迁移到 JBoss 7.1 时遇到了这个问题。

根据 JBoss AS 7.1 JPA 文档 ( https://docs.jboss.org/author/display/AS71/JPA+Reference+Guide#JPAReferenceGuide-Persistenceunitproperties),

JBoss 7.1 会自动设置多个休眠属性。正在设置的属性之一是激活使用不同算法且不向后兼容的新 ID 生成器。在持久性中将此属性设置为 false.xml文件将还原旧的 ID 生成器行为。hibernate.id.new_generator_mappings

休眠 4 文档还包含有关新 ID 生成器的信息:http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html_single/#mapping-declaration-id-generator

休眠文档明确指出,默认情况下不启用新的 ID 生成器,但如上所述,JBoss 7.1 会自动启用它们。


推荐