2014-02-11 68 views
0

我有一個現有的數據庫模式,我試圖使用Hibernate 4.1.6。我需要支持多種數據庫版本,包括Oracle,所以我使用SequenceStyleGenerator進行id生成。我創建了一個用於Oracle中的生成器的序列。休眠從序列中減去一個

如果序列有一個現有的值(比如2),那麼我可以看到,當我調用實體上的保存或更新時,Hibernate調用sequence的nextval以獲得下一個值並得到3,這是正確的。然後,出於某種原因(在Hibernate類的OptimizerFactory中),Hibernate從序列值中減去1以獲得要使用的id,由於唯一的約束錯誤而失敗 - 如果nextval爲3,則2已被使用。

爲什麼Hibernate從序列中減去1以獲得用於id的值,以及如何讓它使用該序列?

+0

你可以添加你的代碼到目前爲止你嘗試過什麼 –

回答

0

我對SequenceStyleGenerator使用了池化優化器,問題與此有關。 Hibernate文檔說,當使用池化優化器時,'我們只需將「下一個組」的起始值存儲到數據庫結構中,而不是將順序值與內存中分組算法結合使用。所以我猜想當Hibernate讀取nextval並獲得3時,它會減去1以得到它用作下一個組的起始值的currval。

我將嘗試使用「無」優化器...還試圖找到一些文檔,解釋更多關於池彙集的優化器以及如何配置它,如果除Hibernate以外的應用程序要插入數據使用相同的順序。