2012-04-12 61 views
0

Java的休眠和PostgreSQL與Hibernate對PostgreSQL數據庫插入特定ID

表:

CREATE TABLE players 
(
    id serial NOT NULL, 
    .... 
) 

HBM:

<class name="Player" table="players"> 
     <id name="id" column="id"> 
      <generator class="identity" /> 
     </id> 
... 

我希望能夠在某些情況下,插入一個特定的ID因爲我從其他數據源導入數據並需要維護ID一致性。

當用hibernate插入時,即使我設置了對象的ID,它仍然會插入,而不使用我指定的ID。

是否有設置可以更改爲支持在插入時指定ID?

+0

我無法回答這個問題,但我確實希望提醒您我遇到了一些問題,我已經看到有人報告過幾次 - 如果您插入具有顯式值的行,而不是讓它們從與串行列,序列不知道這些值,並且如果您沒有避免這種情況的策略,則可能會出現重複鍵錯誤。 – kgrittn 2012-04-12 21:19:19

回答

1

注:我意識到OP主要是專門詢問Hibernate,我承認我沒有經驗。我只是覺得有必要討論爲什麼這對我來說不適用於任何對象關係模型。

我不確定使用ORM直接導入數據是個好主意。如果您正在導入數據,並且導入的數據的ID位於尚未生成的範圍內,那麼您最終應該獲得重複項(如果按照這種方式設置,則會出現主鍵問題)。 Postgresql創建單獨的sequence對象以維護不受使用它們的表影響的序列。任何使用ORM的解決方案也應該解決這個問題。貌似可以通過setval PostgreSQL的評價被操縱(見http://www.postgresql.org/docs/9.1/static/functions-sequence.html

如果您仍然需要使用這個的ORM,我會忍不住創建一些數據「落地」表,以產生對他們的班ORM工具,然後編寫一些SQL函數,用您剛剛上傳的數據修補您的實時表格。可能有另一種更好的方法,但我希望看到它。

+0

這是一種侮辱?我只是覺得這是一個糟糕的主意。我不得不實施很多不好的想法。 – JayC 2012-04-12 21:33:34

+0

好吧,也許「壞主意」太強大了......我的觀點是它可能需要額外的東西。 – JayC 2012-04-12 21:37:25

+0

也許它確實,也許它通過SQL語句來做會更有效。 – 2012-04-12 21:38:08