2008-10-31 60 views
12

我有一個使用Firebird數據庫作爲數據存儲(嵌入模式)的桌面(winforms)應用程序,並且我使用NHibernate作爲ORM。我們需要支持的功能之一是能夠將數據組導入/導出到外部文件。目前,這個外部文件也是一個與主數據庫具有相同模式的數據庫。使用NHibernate在多個數據庫之間複製實體

我已經把NHibernate設置爲查看多個數據庫,我可以同時使用兩個數據庫。但是,問題是在兩個數據庫之間複製數據。我有兩種複製策略:(1)複製對象的所有相同ID [又名導入/導出]和(2)複製大多數新ID [又名複製/複製]。我說「主要是新的」,因爲有一些查找項目將始終使用相同的ID進行復制。

使用新ID複製所有內容都很好,因爲我只需要一個「CopyForExport」方法,可以創建所有內容的副本並且不分配新ID(或清除對象樹中的所有ID)。

什麼是「最佳實踐」方式來處理這種情況並在保留相同ID的情況下在數據庫之間複製數據?我沒有試圖同步兩個數據庫,只是將一個子集(用戶可選擇的)或數據傳輸給其他人(然後將數據子集導入到他們自己的數據庫中)。

進一步說明:我認爲我已經將問題隔離爲: 我想使用NHibernate的ISession.SaveOrUpdate功能,因此我使用未分配的身份生成器來設置我的實體。但是,我想要覆蓋生成的標識(用於在同一進程中的多個數據庫之間複製數據)時遇到問題。

有沒有辦法使用Guid.Comb或UUID生成器,但能夠有時指定我自己的標識符(用於傳輸到具有相同模式的不同數據庫連接)。

回答

13

我找到了我自己的問題的答案: 關鍵是ISession.Replicate方法。這使您可以在數據存儲之間複製對象圖並保留相同的標識符。要創建新的標識符,我想我可以使用ISession.Merge,但我仍然需要驗證這一點。

雖然有一些注意事項:我的測試類有一個對父對象(多對一關係)的引用,並且我必須讓該類非惰性加載才能使Replicate正常工作。如果我沒有設置爲急切加載(我猜是非延遲加載),它只會複製對象而不是父對象(我的hbm.xml文件中cascade =「all」)。

Java Hibernate文檔有對Replicate()的引用,但NHibernate文檔沒有(在java文檔中爲section 10.9)。

這對複製行爲很有意義,因爲我們希望在將它們傳送到另一個數據存儲之前完全水化實體。但奇怪的是,即使兩個會話都打開(每個數據存儲都有一個會話),但當我想要複製對象時,它並沒有想到會吸收對象。

+0

終於找到了這個解決方案,我遇到了類似的問題。我想這並沒有幫助休眠站點目前停止運行。 – LizB 2009-04-30 05:57:18

0

您可以使用FBCopy。只需定義你想複製哪些表和列,然後我就可以完成這項工作。您也可以爲每個表添加可選的WHERE子句,因此它只複製所需的行。

複製它時確保數據導出的順序得到維護,以便外鍵不會中斷。它也支持生成器。

相關問題