2011-02-14 53 views
2

我想我的數據庫中的任何生成的主鍵是負整數。JPA /休眠/德比TableGenerator使用負值

我定義了一個TableGenerator:

<table-generator name="MY_SEQ" table="MY_SEQUENCE_TABLE" 
        initial-value="-1000000" allocation-size="1" /> 

我以爲這將在-1000000開始第一個生成密鑰,並增加1。每個ID,以便下一個ID將是-999999。

當我創建並堅持一個新的實體,我得到了以下錯誤:

java.sql.SQLIntegrityConstraintViolationException:語句被放棄,因爲它會造成一個獨特的或主鍵約束重複鍵值.. 。

當我檢查MY_SEQUENCE_TABLE時,SEQUENCE_NEXT_HIGH_VALUE中的值是2.我嘗試在ORM.xml中定義表生成器並將其作爲註釋,但行爲在兩種方式中都是相同的。

是否有可能在Hibernate中使用PK的負值?

感謝

更新

我這樣做是因爲我從一個數據庫移動到另一個數據。然後我將數據移回。在此期間,新實體可以在其他數據庫(Derby)中創建。當我將實體移回時,我需要一種方法來確定是否在不更改表模式的情況下在該數據庫上創建它們。我想我會檢查ID爲負值,他們的方式我知道,當我移回數據時必須創建爲新的實體。

有誰知道什麼Hibernate類生成處理TableGenerator並生成序列的表代碼?

更新2

經過一些測試似乎休眠使用表生成器時忽略初始值和分配大小。

我加入這個屬性來的persistence.xml

<property name="hibernate.id.new_generator_mappings" value="true"/> 

我切換到序列發生器和初始值被適當地使用,但分配尺寸不保存作爲負。根據德比規格,負序是有效的。

從10.6參考:

If specified, the INCREMENT value is a non-zero number which fits in a DataType value. If not specified, the INCREMENT defaults to 1. INCREMENT is the step by which the sequence generator advances. If INCREMENT is positive, the sequence numbers get larger over time. If INCREMENT is negative, the sequence numbers get smaller.

關去嘗試更多的東西.....

回答

0

我看了看JPA specification和似乎沒有被任何有關針對初始約束價值,所以這可能與實施有關。含義:如果您要符合標準,則不應使用負值初始值。

您是否嘗試過設置allocation-size ="-1"?我現在不能嘗試這個,但我很好奇Hibernate是如何工作的,因爲數據庫可能有負序列號。

+0

將allocation-size設置爲-1的結果相同。它從0開始並遞增1. Derby數據庫(和其他rdbms)在其INT列上支持負值。我會更新我的選擇,爲什麼我要消極。 – Allan 2011-02-14 16:50:20