2012-07-16 178 views
3

我想寫一個SQL腳本來將數據從一些舊錶遷移到新的表。 新表主鍵(id)由hibernate管理,因此是舊錶的主鍵。 我不知道如何使用普通SQL爲新表分配id,所以我正在做的是從舊錶中取出id。 遷移腳本按預期工作。休眠主鍵約束衝突

在某些情況下,我的應用程序嘗試使用Hibernate將數據插入到新表中,並且我得到主鍵約束違例異常。我懷疑這是因爲休眠分配密鑰與我在遷移舊數據時給予的密鑰衝突。 順便說一句 - 休眠配置爲每個表分配唯一的主鍵。

我在做什麼錯? 我應該如何解決這個問題?

感謝

+0

你是否需要從舊桌子的ID?如果你有新的ID,它會破壞一些東西嗎? – Tomer 2012-07-16 08:22:24

+0

我不必使用舊的ID如果有幫助.. – 2012-07-16 11:59:56

回答

1

如果使用帶有自動增量數據庫主(例如MySQL和MSSQL),你必須設置從現有的IDS自動增量值MAX(遷移之後)鍵列。 如果使用序列生成id(例如oracle,postgree),則必須將當前序列值從現有id(遷移後)更改爲max。

+0

謝謝 - 這可能會有所幫助,但我沒有使用(至少不以我知道的方式)數據庫ID生成器。 我以下列方式使用hibernate註釋: @Id @GeneratedValue(strategy = GenerationType.TABLE) long id; 我不確定它是如何工作的 – 2012-07-16 12:00:34

0

好吧 - 事實證明,在Hibernate中使用@GeneratedValue(strategy = GenerationType.TABLE)時,我們有hibernate_sequences表,它跟蹤我數據庫中每個表的下一個id。所以我所要做的就是更新這個表格並正確設置下一個ID--就像之前所說的那樣。

謝謝!