I am having trouble writing code that would allow get a user and claim details in a straightforward way. This is my MongoDB structure,
db.user.find();
user:
{
"name" : "KSK",
"claim" : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")]
}
claim:
[
{
"_id" : "52ffc4a5d85242602e000001",
"claimName" :"XXXX"
},
{
"_id" : "52ffc4a5d85242602e000000",
"claimName" :"YYY"
}
]
My Entity class is:
@Document(collection="user")
public class User{
@Id
private String id;
private String name;
@DBRef
private List<Claim> claim;
// setter and getter
}
Claim Class:
@Document(collection="Claim")
public class Claim{
@Id
private String id;
private String claimName;
}
I have a method to get the users by name like below,
public User findByName(String name);
If I try to hit this method am getting an error that,
No converter found capable of converting from type org.bson.types.ObjectId
to type java.lang.String
So I changed my User entity class as like below,
Instead of private List<Claim> claim
;
Changed as Private List<ObjectId> claim
;
Now if I execute a method(findByName), I get a user object that has both claimed object ids ("52ffc4a5d85242602e000001","52ffc4a5d85242602e000000")
, then iterate the claim list and get the claim details corresponding to the claim object Id.
Instead of doing this, when I execute findByName
method I want to get a user and claim details. How can I achieve this functionality?
If you reference your Claim
s in the User
class with @DBRef, your JSON should not only contain the ID but the reference to the collection where to find the ID as well, like this:
{
"name" : "KSK",
"claim" : [
{
"$ref" : "claim", // the target collection
"$id" : ObjectId("52ffc4a5d85242602e000000")
}
]
}
That is how Spring-Data maps your Java objects to MongoDB . If you start with a blank database and let Spring create and save the relations, you should have no problems using
@DBRef List<Claim> claims;
My suggestion is not to set that Claim class into separate @Document or just switch back to Relational Databases, because it's not a Mongo approach. Also, if you insist on current architecture you can try using @DBRef above that List in User.class into smth like this:
public class ParentModel {
@Id
private String id;
private String name;
private ParentType parentType;
private SubType subType;
@DBRef
private List<Model> models;
....
}
as an alternative to @DBRef, take a look at RelMongo ( link ) which provides a powerfull way to manage relations, in your case it will be like this :
@OneToMany(fetch = FetchType.LAZY)
private list<Claim> claims;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.