Tom*_*mer 39 java hibernate jpa jpa-2.0 jboss7.x
我有一个具有以下定义的类:
@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;
Run Code Online (Sandbox Code Playgroud)
当我们在Jboss 4.2.3上运行它时它工作正常并生成了正确的ID(从1000+开始)
现在我们转移到jboss 7.1.1并生成负ID!(从-498开始上升)
知道为什么会这样吗?
ska*_*kay 75
新的行为如下:
AllocationSize是为Hibernate保留的一系列主键值.seq.nextval
只有在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;
Run Code Online (Sandbox Code Playgroud)
否则,您会注意到由于主键冲突而从数据库引发的负值或约束错误.
重新启动应用服务器时,您会注意到分配的最新主键和重新启动时选择的"新"序列号之间的"跳转".
最终评论:默认值为50.因此,如果您未allocationSize
在Hibernate端指定,则必须increment by
在DB端声明50.
小智 37
我从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会自动启用它们.
fal*_*lla 23
设置hibernate.id.new_generator_mappings
要false
在我persistence.xml
还只是解决我的问题的第一部分:
为了彻底解决问题我添加allocationSize
到1
在@SequenceGenerator
(我被省略).
归档时间: |
|
查看次数: |
29857 次 |
最近记录: |