2012-01-09 7 views
9

のために私はMongoDBの中で1つのコレクションに異なるデータを保存し、適切なフィールドで春データ豆を持ちたい...春データのMongoDBクラスの継承

申し訳ありませんが、私はスキップされた詳細をしました。

親豆:

class A 
    int a 

チャイルズ:私はデータをフェッチするとき

class B extends A 
    double b 

class C extends A 
    String c 

ので、以下の文書はモンゴであり

{a : 1, b : 2.3, c : "Test"} 

、それは大丈夫です。しかし、私はBのためCrudRepositoryから保存メソッドを呼び出すとき、それはすべてのデータを書き換え、私はそのような

update.set("b", newvalue)... 
として、

が、私はカスタム作成増分更新でメソッドを保存するための唯一の良いオプションを知っているC.

失います

ですが、反射があります。

他にもアイデアはありますか?

ありがとうございます。

+1

'MongoTemplate'とリポジトリとのやりとりについてもう少し詳しくお考えですか?あなたは 'B'のオブジェクトにデータを読み込んでいますか?格納された型情報を検出する必要があるので、実際には 'C'型のオブジェクトを返すべきです。それを超えると、コレクションのマッピング情報が役立ちます。すべてのクラスが同じコレクションにマッピングされていることを確認してください。 –

+0

こんにちはオリバー、あなたの答えに感謝します。はい、更新クエリを使用するには、 'MongoTemplate'の 'save'メソッドをオーバーライドしました。今私が 'B'を保存すると、 'B'フィールドのみが更新されます。しかし、私はもっと素晴らしいソリューションを見つけようとしています... –

+0

関連するコードスニペットを追加すると、問題に少しでも潜んでしまうかもしれません:) –

答えて

5

SpringデータMongoTemplateの場合、オブジェクト内のフィールドに加えて、 という追加のフィールド名_classも保存され、保存するクラスをテンプレートに伝えます。
継承関係のにかかわらず、別のオブジェクトのリポジトリを使用してオブジェクトを正しく保存することはできません。

春のCrudRepositoryは、本質的にはGeneric Daoパターンです。あなたのDAOはすべてインターフェイスを実装し、saveメソッドを持っているので、どのDAOを使用するかを知ることでオブジェクトのいずれかを保存することができます。

これを行うには、リポジトリを初期化するために使用するRepositoryFactoryを作成します。このリポジトリには、クラスに適したリポジトリを提供するgetRepository(クラス型)関数が用意されています。 (あなたが同じコレクション内のすべてのオブジェクトを格納する場合http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

、あなたは注釈@Documentを使用することができます:あなたはここでは詳細を見つけることができます

repositoryFactory.getRepository(myType.getClass()).save(myType); 

:次に、あなたのような何かを行うことができるようになりますコレクション= "mycollection")。コレクション名を指定しない場合、デフォルトではクラス名に従って各クラスを別々のコレクションに保存します。