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" 。