2014-05-22 52 views
1

在我的spring項目中,數據庫中的表是由Hibernate使用我的實體類作爲基礎自動創建的,但我手動在表中插入了一些默認值(使用pgAdmin3)。手動更新用於在Hibernate中生成主鍵的計數器?

因爲這樣,我現在面臨這個問題:當我嘗試通過Java代碼在其中一個已經有值的表中插入一個值時,我收到一條錯誤消息,說主鍵已經存在於數據庫中。

任何人都知道如何解決這個問題?

UPDATE

這就是我聲明我的主鍵在我的課:

@Id 
@Column(name = "id") 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 
+0

你使用什麼樣的列作主鍵? –

+0

我更新我的問題,以顯示我如何聲明我的主鍵 –

回答

3

呼叫每桌一旦這種SQL查詢的順序設置爲下一個免費電話:

SELECT setval('tblname_id_seq', max(id)) FROM tblname; 

tblname是表的實際名稱。

Hibernate可能會使用不同的命名約定,或者序列可能已被重命名。如果你不能找到serial柱後面的序列,請與(per documentation):

SELECT pg_get_serial_sequence(tblname, column_name) 

更多細節:
Modify Django AutoField start value
How to import a CSV to postgresql that already has ID's assigned?

+0

我在這裏理解的是您的示例工程更新postgresql服務器中的此tblname_id_seq。但是我沒有這個序列,我的主鍵只能由Hibernate處理。 –

+0

@KleberMota:序列號通常由RDBMS處理。每個「串行」列後面都有一個序列對象。按照指南的鏈接瞭解更多信息。我添加了一個方法來查找序列。 –

+0

hibernate_sequence是默認情況下hibernate使用的序列的名稱。試着在pgAdmin3中查找這個序列,在上面的查詢中使用它。 –

0

這裏的問題可能是你聲明的id原始而不是包裝。

所以不是:

private int id; 

你應該有:

private Integer id; 

當您創建實體與ID被初始化爲0,而不是空。

這就是爲什麼你會得到重複的id約束違例例外。

只有當id爲NULL時,AUTO生成策略纔會將id分配委託給數據庫。

+0

我更新我的代碼,將我的Id更改爲整數,但仍然存在相同的問題(順便說一句,實體未使用0初始化,而是使用數字序列中的最後一個數字 - 最後一個數字是9 - ,它與我通過程序插入的元素數量相匹配,因爲我認爲Hibernate有自己的計數器)。 –

+0

[根據Hibernate文檔](http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch04.html#persistent-classes-pojo-identifier):「我們建議你在持久化類上聲明一致命名的標識符屬性,並且使用可空(即非基元)類型。「 –

+0

至於手動插入的默認值,請確保在插入時始終使用序列,並且不要手動分配值。最好將PRIMARY KEY設置爲:id bigint NOT NULL DEFAULT nextval('my_table_sequence':: regclass) –