2016-11-16 5 views
0

私の会社は、ORMのためにmorphiaを使用したjavaプロジェクトに接続されたmongodbを使用します。最近、コードベースのリファクタリングが行われ、パッケージ名が変更されました。残念ながら、パッケージ名の変更により、既存のデータベースに問題が生じました。既に生産中の顧客がいるため、データベースを更新し、製品を更新するときにはじめて開始するように指示することはできません。オブジェクトクラスのリファクタリング後の生産におけるMorphia/mongodbの更新

私は2つのアプローチを試みました。 1つは、classNameフィールドの古い値を持つすべてのエントリを正しい値に更新するスクリプトを作成することでした。 もう1つの方法は、すべてのエントリからclassNameフィールドを削除し、noClassnameStoredアノテーションをクラスに追加することでした。

いずれの方法も既存のデータベースを新しいバージョンの製品の下に読み込むことはできませんでした。私は今、おそらく問題は、私たちが使用する組み込みオブジェクトであると考えています。私たちの "Job"クラスには、JobParametersをクラスとして使用するparametersというフィールドがあります。次に、フィールドに派生クラスを設定します(例:MigrationJobParametersはJobParametersを拡張します)。これらのクラス(JobParameters基底クラスだけでなく)の両方とも、 "embedded"と "concreteClass ="注釈を使用します。 私はmorphiaが先に進み、データベースオブジェクトにclassNameフィールドを追加することに気付きました。これは私にとって意味のあるものです。

Javaが終了すると、JobParametersをMigrationJobParametersにキャストできないという例外がスローされます。これはもう一度意味をなさないものです。

私の質問は、オブジェクトの名前空間が変更された後に継承を持つ埋め込みオブジェクトを含む既存のデータベースを更新する方法です。

答えて

0

私の疑惑は、エンティティはclassNameを必要としませんが、オブジェクトがtypeである埋め込みオブジェクトはオブジェクトがclassNameを持つ必要があるため、morphiaは適切なクラスにそれらを逆シリアル化できます。だから基本的に私が試みた両方のアプローチは部分的に正しいものでした。

ソリューションは、このようです:エンティティのため

  • クラスはnoClassnameStoreアノテーションを持っている必要があります。
  • 埋め込みオブジェクトのクラスには、concreteClass アノテーションが必要です。
  • 更新スクリプトは、それを必要とする組み込みオブジェクト のclassNameフィールドを更新する必要があります。
  • 更新スクリプトは、他のすべてのclassNameフィールドをすべて削除する必要があります。
関連する問題