2012-09-05 32 views
0

我正在使用XStream對遺留系統進行序列化對象以保持兩個數據庫同步。一個新的對象首先被存儲在一個數據庫中,然後被存儲的對象被序列化並被髮送以存儲在另一個數據庫中。XStream - 處理具有相同標識符的對象

直到最近,有關對象的結構是這樣的:

public class Project { 
    List<Milestone> milestones; 
    [...] 
} 

但是,變化的要求後,結構應該是這樣的:

public class Project { 
    List<Goal> goals; 
} 

public class Goal { 
    List<Milestone> milestones; 
} 

爲了保持對目標一無所知的傳統數據的里程碑,項目的最終結構是這樣的:

public class Project { 
    List<Goal> goals; 
    List<Milestone> milestones; 
} 

因此,從項目到里程碑有兩條路徑,一條直接通過目標。當這個結構被反序列化並存儲時,就會出現問題。當它被XStream反序列化時,連接到項目的里程碑的對象直接成爲與通過目標連接的對象不同的對象,即使它們具有相同的ID。

只要Hibernate的Session#merge()被用來保存這個對象,這是沒問題的,因爲merge()不關心對象標識符,只要db標識符是相同的。

但是,我不能再使用merge()來達到這個目的,而必須依靠Session#save()來代替。 save()DO關心對象標識符!所以現在當我試圖存儲反序列化的對象時,我得到了一個org.hibernate.NonUniqueObjectException。

我認爲解決這個問題最少的方法是,如果可能的話,讓XStream爲每個數據庫ID創建一個對象。但是這可能嗎?

+0

我一直認爲應該可以通過[Object References](http://xstream.codehaus.org/graphs。 HTML)。你可以添加用於序列化和反序列化對象的代碼嗎? – DB5

+0

XML文件是否使用對象引用?檢查以確保您期望的兩個里程碑實例相同,在XML中被引用。可以明確定義一個,並且在項目 - >目標 - >里程碑中,它應該反向引用已經定義的那個。 – eipark

+0

我認爲它實際上有反向引用機制,經過一些考慮後,問題不是由於序列化本身,它由於項目的另一個不錯的「特徵」 - 我會創建一個答案解釋。 – Tobb

回答

0

經過一番考慮後,我發現問題不是XStream,因爲它具有對象引用的機制。問題是我正在研究的項目的另一個漂亮的「特徵」 - 它具有每個域類的兩個版本,一個用於與Hibernate通信,另一個用於「邏輯使用」(不要問我爲什麼......)在這兩個版本(基本上是將值從一個對象移動到另一個對象)之間的轉換中,對象是不加批判地新建的,導致相同的「Hibernate對象」被轉換爲多個「Java對象」。然後,我不能指責XStream不理解這些應該是相同的:)

相關問題