web-dev-qa-db-ja.com

Spring Mongodb @DBREF

これは私のMongoDb構造です。

db.user.find();

ユーザー:

{
"name" : "KSK", 
 "claim"  : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")] 
}

請求:

[
   {
     "_id" : "52ffc4a5d85242602e000001",
     "claimName" :"XXXX"
   },
   {
     "_id" : "52ffc4a5d85242602e000000",
     "claimName" :"YYY"
   }
]

私のエンティティクラスは次のとおりです。

@Document(collection="user")
public  class User{
  @Id      
  private String id;
  private String name; 
  @DBRef
private List<Claim> claim; 
// setter and getter 

}

クレームクラス:

@Document(collection="Claim")
public class Claim{
   @Id 
   private String id; 
   private String claimName;   
}

以下のような名前でユーザーを取得する方法がありますが、

public User findByName(String name);

このメソッドをヒットしようとすると、次のエラーが表示されます。

タイプorg.bson.types.ObjectIdからタイプJava.lang.Stringに変換できるコンバーターが見つかりませんでした

そこで、以下のようにユーザーエンティティクラスを変更しました。

代わりにprivate List<Claim> claim;

Private List<ObjectId> claimとして変更されました;

メソッド(findByName)を実行すると、両方のクレームオブジェクトID( "52ffc4a5d85242602e000001"、 "52ffc4a5d85242602e000000")を持つユーザーオブジェクトを取得し、クレームリストを反復処理してクレームオブジェクトIDに対応するクレームの詳細を取得します。

これを行う代わりに、findByNameメソッドを実行するときに、ユーザーを取得して詳細を要求します。この機能を実現するにはどうすればよいですか

9
KSK

ClaimクラスのUsersを@DBRefで参照する場合、JSONにはIDだけでなく、次のようにIDを検索するコレクションへの参照も含める必要があります。

{
  "name" : "KSK", 
  "claim"  : [ 
     { "$ref":"claim", // the target collection
       "$id : "ObjectId("52ffc4a5d85242602e000000")
     }
  ] 
}

これが、Spring-DataがJavaオブジェクトをMongoDBにマッピングする方法です。空のデータベースから始めて、Springでリレーションを作成して保存する場合、問題なく使用できます。

 @DBRef List<Claim> claims;
4
Matt

私の提案は、そのClaimクラスを個別の@Documentに設定したり、単にリレーショナルデータベースに切り替えたりすることではありません。Mongoのアプローチではないからです。また、現在のアーキテクチャを主張する場合は、User.classのListの上にある@DBRefを使用して、次のようなsmthを試すことができます。

public class ParentModel {

    @Id
    private String id;

    private String name;

    private ParentType parentType;

    private SubType subType;

    @DBRef
    private List<Model> models;

....
}
2
Andrew Petryk