2013-04-16 58 views
1

我正在使用IBM DB2 v9.1並希望將所有數據庫導出到xml文件,並在需要時將其導回。我的數據庫中有9個表格。我正在使用java and hibernate。到目前爲止,我所做的是:通過hibernate獲取所有數據並填充POJO對象,然後將對象導出到xml文件。現在爲了導入,我需要首先刪除所有現有數據庫,然後將xml文件數據導入數據庫。從xml導入數據庫

問題出在主鍵(ids)。一旦id從DB2中刪除,那麼數據將無法使用該ID保存,並且會爲其分配新的ID。這擾亂了外鍵關係。什麼是最好的解決方案?

回答

0

導入文件後,所有的關係將被映射到檢查其相互關係。新對象將在映射關係後創建,並且它們將使用新ID保存在數據庫中,因爲DB2不會將數據保存在舊的已刪除ID上並將其保存到新ID中。

0

什麼你所有的數據庫意思?所有數據?甚至是DDL?

我認爲您正在導出所有數據,並且您將創建的表格重新填充導出的數據。

問題是約束和生成的值。有一篇關於生成值的好文章:http://www.ibm.com/developerworks/data/library/techarticle/0205pilaka/0205pilaka2.html

對於引用約束,最好是在導入前刪除/停用它們,然後導入數據,最後重新創建/激活參考約束。

在這裏,一個好的存儲過程來啓用/禁用約束:http://www.dzone.com/snippets/db2-enabledisable-constraints

+0

丟表可能工作,但我不得不放棄表工作。 –

+0

我沒有說放棄表格,我的意思是放棄限制或停用它們。 – AngocA

0

也許MERGE statement能來拯救你。如果已經有一行具有匹配的id,它會讓你更新行。如果沒有匹配ID的行,那麼它會讓你插入它。

那麼這個問題可能會變成:在創建XML文件時,是否真的需要從DB2中刪除行?

+0

我試過但合併沒有給我結果。刪除後,我使用merge()保存該實體,但使用新ID保存該實體,儘管在調用merge()之前ID設置爲舊值。 –

+0

這聽起來像你可能有身份字段,它是用GENERATE ALWAYS而不是GENERATE BY DEFAULT定義的。你可以或者你的DBA改變這些定義嗎? – WarrenT