Spring Mongo DB @DBREF

Viewed 31051

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?

3 Answers

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;
Related