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

Java Hibernate在使用序列时生成负id值,java,hibernate,jpa,jboss7.x,jpa-2.0,Java,Hibernate,Jpa,Jboss7.x,Jpa 2.0,我有一个定义如下的类: @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") @Colu

我有一个定义如下的类:

@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;
当我们在JBoss4.2.3上运行它时,它运行良好,并生成了正确的ID(从1000+开始)

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


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

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

根据JBossAS7.1JPA文档()

JBoss7.1自动设置几个hibernate属性。正在设置的属性之一是
hibernate.id.new_generator_mappings
,它激活使用不同算法且不向后兼容的新id生成器。在persistence.xml文件中将此属性设置为false将恢复旧的ID生成器行为

hibernate 4文档还包含有关新ID生成器的信息:


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

设置
hibernate.ID.new\u生成器\u映射
false
在我的
持久化.xml
中只是解决问题的第一部分:


为了彻底解决这个问题,我在
@SequenceGenerator
中添加了
allocationSize
1
(我省略了它)。

新的行为如下:

AllocationSize是为Hibernate保留的一系列主键值。 只有在hibernate使用了这个范围的主键之后,才能从dual中选择
seq.nextval

因此,您必须在
分配
(休眠)和序列
增量
(DB)上声明相同的值

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

create sequence SEQ_ACE_WORKERS_QUEUE_STATS_ID
       MINVALUE 1 
       MAXVALUE 999999999999999999999999999 
       START WITH 1
       INCREMENT BY 500 
       NOCACHE 
       NOCYCLE;
否则,您将注意到由于主键冲突而从数据库中引发的负值或约束错误

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


最后一点意见:默认值为50。因此,如果您没有在Hibernate端指定
allocationSize
,则必须在DB端声明
increment by
50。

您是否检查了Oracle中的当前序列并跟踪Hibernate输出,如果您看到正确的select next sequence查询,并且如果您将粘贴复制到sqlplus中,则会得到正确的/相同的/预期的结果?感谢您的回答,我已经找到了它,但忘了在此处更新它:(从Hibernate 5.0版开始,
Hibernate.id.new_generator_mappings
属性默认为
true
。请参阅非常有用的答案,因为这些信息显然不在Hibernate文档中。这对我帮助很大。我无法让@SequenceGenerator正常工作,因为我不断得到负值和约束错误。只是添加allocationSize=1解决了这个问题。我正在使用PostgreSQL。但是为什么必须同时添加这两个?除了allocationSize更改之外,新的\u生成器\u映射的哪一部分产生了一个通过将其设置为false来解决的问题?设置为false在设置allocationSize之后才起作用