使用序列时,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开始上升)
知道为什么会这样吗?
我从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属性。 正在设置的属性之一是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会自动启用它们。
新的行为如下:
AllocationSize是为Hibernate保留的一系列主键值。 只有在hibernate消耗了这个主键范围之后, seq.nextval
从dual中选择seq.nextval
。
所以你必须在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。
在我的persistence.xml
中将hibernate.id.new_generator_mappings
设置为false
只是解决我问题的第一部分:
为了完全解决这个问题,我在@SequenceGenerator
添加了allocationSize
为1
(我省略了)。
- JPA / hibernate大集合
- Tomcat-Spring-Hibernate Web应用程序中的“PermGen out of space”exception可以做些什么?
- JPA spring boot内部join – with-clause引用了两个不同的from-clause元素错误
- Hibernate:动态更新动态插入 – 性能效果
- 数据未保存:对象引用未保存的瞬态实例 – 在刷新之前保存瞬态实例
- 在Microsoft sql server中连接/附加不同的表
- 使用hibernate注释将枚举映射到表
- 这个嵌套注释做什么/允许什么?
- 如何将@UniqueConstraint与单表inheritance(JPA)一起使用?