これは私の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メソッドを実行するときに、ユーザーを取得して詳細を要求します。この機能を実現するにはどうすればよいですか
Claim
クラスのUser
sを@DBRefで参照する場合、JSONにはIDだけでなく、次のようにIDを検索するコレクションへの参照も含める必要があります。
{
"name" : "KSK",
"claim" : [
{ "$ref":"claim", // the target collection
"$id : "ObjectId("52ffc4a5d85242602e000000")
}
]
}
これが、Spring-DataがJavaオブジェクトをMongoDBにマッピングする方法です。空のデータベースから始めて、Springでリレーションを作成して保存する場合、問題なく使用できます。
@DBRef List<Claim> claims;
私の提案は、その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;
....
}