Spring Mongo DB @DBREF

筅森魡賤 提交于 2020-02-29 12:50:16

问题


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 claim 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


回答1:


If you reference your Claims 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;



回答2:


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;

....
}



回答3:


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;


来源:https://stackoverflow.com/questions/44259583/spring-mongo-db-dbref

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!