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

新手上路,请多包涵

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

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

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

原文由 Tomer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 777
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 自动设置几个休眠属性。正在设置的属性之一是 hibernate.id.new_generator_mappings 激活使用不同算法且不向后兼容的新 ID 生成器。在 persistence.xml 文件中将此属性设置为 false 将恢复旧的 ID 生成器行为。

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

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

原文由 jrm 发布,翻译遵循 CC BY-SA 3.0 许可协议

新行为如下:

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

因此,您 必须allocationSize (Hibernate) 和序列 increment by (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。

原文由 skay 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题