10

MongoDb の 1 つのコレクションに異なるデータを格納し、Spring データ Bean に適切なフィールドを設定したいと考えています。

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

親ビーン:

class A
    int a

チャイルズ:

class B extends A
    double b

class C extends A
    String c

したがって、mongoには次のドキュメントがあります

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

データを取得すると、問題ありません。しかし、B の CrudRepository からsaveメソッドを呼び出すと、すべてのデータが書き換えられ、C が失われます。

次のように、増分更新を使用してカスタム保存方法を作成するための良いオプションを 1 つだけ知っています。

update.set("b", newvalue)...

しかし反省あり。

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

前もって感謝します。

4

2 に答える 2

7

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

SpringのCrudRepositoryは、基本的にGenericDaoパターンです。すべてのdaoがインターフェイスを実装し、saveメソッドを持っているため、使用するdaoを知ることで、任意のオブジェクトを保存できます。

これを行うには、リポジトリを初期化するために使用されるRepositoryFactoryを作成できます。これは、クラスに適切なリポジトリを提供するgetRepository(Class <?> type)関数を提供します。次に、次のようなことができるようになります。

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

詳細については、https://web.archive.org/web/20160722023804/http ://www.rainydayinn.com:80 / dev /dao-factory-and-generic-dao-wiring-in-springをご覧ください。 //

すべてのオブジェクトを同じコレクションに保存する場合は、アノテーション@Document(collection = "mycollection")を使用できます。コレクション名を指定しない場合、デフォルトでは、クラス名に従って各クラスを個別のコレクションに保存します。

于 2012-02-18T15:45:52.527 に答える