2011-05-10 116 views
1

以下情況:合併具有相同結構和休眠映射的兩個數據庫

我得到了兩個具有相同結構的數據庫。在每個這些數據庫之上運行使用Hibernate for ORM的相同應用程序的一個實例。這兩個是完全獨立的。

現在我必須將兩個應用程序合併爲一個。在一些表格中,需要進行調整以避免違反唯一的關鍵限制。

既然兩個數據庫在結構上都相同,並且使用了相同的Hibernate映射,那麼是否有一種方法可以使用Hibernate來完成任務?我想從數據庫A加載一個對象,在代碼中修改它,並簡單地從基於數據庫B的SessionFactory保存到Session。我想知道Hibernate是否能夠相應地更新主鍵和外鍵值,處理從數據庫A複製的對象的依賴性是多麼困難(因爲它們不再需要)。

有什麼建議嗎?

回答

0

僅僅從數據庫A執行數據庫轉儲並將其導入數據庫B不是更容易嗎?或作爲替代使用insert into B.table (col1,col2) values (select col1,col3 from A.table)

+0

這是不可能的,因爲存在唯一的關鍵約束。有些條目也必須合併成一個,而其他條目將保持獨立。 – Lunikon 2011-05-10 13:20:08

0

如果您的數據庫是MySQL,則使用MERGE存儲引擎。以下是步驟:

- 在您的一個數據庫中,使用cascade all通過Hibernate更新所有ID。所有的ID必須通過每個表上其他數據庫的最後一個ID來遞增:

User1(2000 rows,lastId:2000)and User2(3000 rows,lastId:3000) - > User1(2000 rows,lastId :2000)和用戶2(3000行,firstId:3000,lastId:6000)

- 創建一個其他的數據庫,合併所有的數據庫

-extract轉儲從您的新的數據庫,並在你的最後裝載該轉儲數據庫 - >http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html

這是一種可能的方法:)

+1

這是不可能的,因爲存在唯一的關鍵約束。有些條目也必須合併成一個,而其他條目將保持獨立。 ;-) – Lunikon 2011-05-10 19:43:08

0

我知道這是一個古老的線程,但我有一個類似的問題。我解決了包括兩個日期字段:included_datechanged_date我的表,並且,我還包括另一個字段來保存我最後同步數據庫的其他地方(我有一個表與配置信息)的日期。

當我的系統連接到服務器時,我發送上次同步的日期,然後我的例程可以比較自上次同步以來包含或更改的行。

每一個新行我將日期設置到included_date字段中,所以當我同步時我知道哪些行是在我上次同步後創建的,那麼我可以執行INSERT。行更改和changed_date字段也是一樣,然後我執行UPDATE