2016-11-16 36 views
0

我的公司使用連接到我們的java項目的morpho for ORM東西的mongodb。最近我們已經對代碼庫進行了一些重構,包名稱也發生了變化。不幸的是,軟件包的重命名導致了EXISTING數據庫的問題。因爲我們有已經在生產的客戶,所以當我們更新產品時,我們無法真正告訴他們擦拭他們的數據庫並重新開始。在對象類的重構之後更新生產中的Morphia/mongodb

我試過兩種方法。一種是編寫一個腳本,用於將className字段的舊值更新爲正確的值。 另一種方法是從所有條目中刪除className字段,並將noClassnameStored註釋添加到類中。

這兩種方法似乎都不允許現有數據庫在新版本的產品下加載。我現在認爲,也許這個問題與我們使用的嵌入式對象有關。我們的「Job」類有一個稱爲參數的字段,它使用JobParameters作爲類。然後,我們使用派生類填充字段,(例如,MigrationJobParameters擴展了JobParameters)。這兩個類(以及JobParameters基類)都使用「embedded」和「concreteClass =」註釋。 我注意到morphia繼續前進,並將className字段添加到數據庫對象,這對我而言是有意義的。

在一天結束時,Java拋出一個異常,它無法將JobParameters轉換爲MigrationJobParameters,這也是有道理的。

所以我的問題是如何更新現有的數據庫,其中包含對象的名稱空間更改後繼承的嵌入的對象。

回答

0

我的懷疑結果是正確的,問題是雖然實體不需要className,但是嵌入對象的類型需要對象具有className,因此morphia可以將它們反序列化爲適當的類。所以基本上我嘗試的兩種方法都是正確的。

解決的辦法是這樣的:

  • 爲實體的類應具有noClassnameStore註釋。
  • 嵌入對象的類應該具有concreteClass 註釋。
  • 更新腳本應更新 需要它的嵌入對象的className字段。
  • 更新腳本應該刪除其他所有的className字段。
相關問題