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之后才起作用