2012-04-25 26 views
2

這是我第二篇關於hibernate的文章。自從我開始使用hibernate以來,它已經給出了比它解決的問題更多的問題。這幾乎讓我覺得我應該堅持原始的JDBC。無論如何,Hibernate SequenceGenerator返回不正確的nextval

這是我試圖戰鬥的問題之一。

.hbm文件中的我的序列生成器如下所示。

<id name="id" type="long" column="ID"> 
    <generator class="sequence"> 
     <param name="sequence">ADVENTURES_ID_SEQ</param> 
     <param name="allocationSize">1</param> 
     <param name="initialValue">17599</param> 
    </generator> 
</id> 

請注意:初始值是17599.這是因爲LAST_NUMBER在oracle序列爲:17599

CREATED   25-APR-12 
LAST_DDL_TIME 25-APR-12 
SEQUENCE_OWNER ADVENTURE_ADMIN 
SEQUENCE_NAME ADVENTURES_ID_SEQ 
MIN_VALUE  1 
MAX_VALUE  9999999999999999999999999999 
INCREMENT_BY 1 
CYCLE_FLAG  N 
ORDER_FLAG  N 
CACHE_SIZE  20 
LAST_NUMBER  17599 

當我運行我看到在201至200產生的下一個序列,該代碼Hibernate調試語句。

DEBUG SQL - select ADVENTURES_ID_SEQ.nextval from dual 
DEBUG SequenceGenerator - Sequence identifier generated: 201 

我預計nextval應該是17600.看起來像oracle序列根本沒有被使用。

我的配置有什麼問題,以及如何解決這個問題。任何幫助是極大的讚賞。

感謝

+0

如果您在同一數據庫上運行'從雙選'選擇ADVENTURES_ID_SEQ.nextval,它會產生什麼? – Firo 2012-04-26 09:53:55

+0

它給出了正確的值17584,17585,17586等。我們的DBA告訴我們信息表有時可以顯示不正確的值,在這種情況下是17599。這個不正確的值是因爲他們(Oracle)做了一些快捷方式來計算信息,它只能用作指導。 – n00bc0der 2012-04-26 13:46:58

回答

2

自答(解決方法):我仍然看到這個問題,但現在我有一個解決辦法。由於它對我有用,所以我選擇了完整的問題。

我讓甲骨文生成nextId使用觸發:

create or replace 
TRIGGER ADVENTURE_ADMIN.ADVENTURES_ID_TRIG 
BEFORE INSERT ON ADVENTURE_ADMIN.ADVENTURES FOR EACH ROW 
WHEN (new.ID IS NULL) 
BEGIN 
    SELECT ADVENTURES_ID_SEQ.NEXTVAL INTO :new.ID FROM DUAL; 
END; 

然後我讓休眠使用Oracle觸發器生成的ID。有兩種方法可以做到這一點。

第一個是通過使用休眠select。這種方法的缺點是你需要在表中有另一個列,並且有唯一的約束,這個約束被hibernate用作獲取行的鍵。它並不適合我,因爲我擁有主鍵作爲唯一唯一鍵的表。

第二個是使用由Jean-Pol Landrain,Martin Zeltner創建的TriggerAssignedIdentityGenerator。來源可以發現here。這使我能夠解決爲表格找到另一個唯一鍵的問題。

以下是我如何使用它:

<id name="id" type="long" column="ID"> 
    <generator class="org.hibernate.id.TriggerAssignedIdentityGenerator" /> 
</id> 

請注意:您正在使用Hibernate的事務版本。我正在使用3.5.4。休眠3.6不適合我。 JDBC和Oracle驅動程序版本也很重要。您可以參考源文件中的相同文檔。

+1

很高興我的ID發電機幫助你! 您可以在Hibernate論壇上找到與此生成器相關的原始帖子。現在它已經很老了,但許多人的貢獻使它保持活着,即使使用Hibernate 4. https://forum.hibernate.org/viewtopic.php?t=973262 – jplandrain 2013-11-20 10:20:19

+0

@ n00bc0der你找到了你的問題的原因? – 2017-10-25 20:57:25