2012-03-27 60 views
4

我一直在使用与JBoss 4.2.3休眠和一切工作,现在我迁移代码到JBoss 7.1.1,突然我开始越来越:休眠抛出PK冲突错误

Caused by: org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (OBLICORE.PK_ACE_WORKERS_QUEUE_STATS_ID) violated 

而且生成的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; 

我在甲骨文检查顺序,似乎OK(就像我说的,它与JBoss 4.2前工作,因为在DB端没有什么改变移民)。

我试着编写Hibernate查询日志,但找不到该查询,并且我还记录了持续这个类的特定调用,并且看到它只调用一次。

回答

7

检查这个问题:hibernate oracle sequence produces large gap

它必须是被默认为高/低位算法Hibernate的序列发生器,和返回值溢出。您可以尝试使用特定于休眠的注释来默认较早的行为GenericGenerator(name="blah", strategy="sequence")或设置allocationSize=1

如果您依赖于序列递增大于1的值,则必须使用不同的生成器。或者,也许足以将hibernate.id.new_generator_mappings设置为false,但这属于新问题的范围。

+0

非常感谢你,我长久以来一直对此感到震惊。 – Tomer 2012-03-27 14:04:47

+0

allocationSize = 1对我来说不起作用,但是strategy =“sequence”就像一个魅力 – Hamedz 2016-11-10 20:28:48

0

如果您的项目中id的生成值不是很重要,请尝试使用@GeneratedValue(strategy = GenerationType.AUTO) 此策略会通过递增1来生成id。希望它对你有用。

+0

我有一个非常大的项目,其中包含许多使用序列的文件,并且该产品已在许多客户站点上部署(这是第8版),所以我不能随意进行更改,我必须坚持我得到了什么。 – Tomer 2012-03-27 11:17:53

1

当我们改变Hibernate的使用新的发电机,我用下面的脚本来解决序列:

DECLARE 
    v NUMBER; 
    BEGIN 
    FOR r IN (select sequence_name from user_sequences) LOOP 
     EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| r.sequence_name ||' INCREMENT BY 50'; 
     EXECUTE IMMEDIATE 'SELECT '|| r.sequence_name ||' .NEXTVAL FROM DUAL' INTO v; 
    END LOOP; 
    END; 
/

如果您allocationSize是500,你应该改变“递增50”到“INCREMENT BY 500" 。