Spring Mongo 数据库 @DBREF

Spring Mongo DB @DBREF

我在编写允许以直接方式获取用户和声明详细信息的代码时遇到问题。这是我的MongoDB结构,

db.user.find();
user: 
    {
    "name" : "KSK", 
     "claim"  : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")] 
    }

claim: 

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

我的实体 class 是:

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

声明Class:

@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

的转换器

所以我更改了我的用户实体 class,如下所示,

而不是private List<Claim> claim

更改为 Private List<ObjectId> claim

现在,如果我执行一个方法 (findByName),我会得到一个具有两个声明对象 ID 的用户对象 ("52ffc4a5d85242602e000001","52ffc4a5d85242602e000000"),然后迭代声明列表并获取与声明对象 ID 对应的声明详细信息。

我没有这样做,而是在执行 findByName 方法时想要获取用户并声明详细信息。我怎样才能实现这个功能?

我的建议是不要将 Claim class 设置为单独的 @Document 或直接切换回关系数据库,因为这不是 Mongo 方法。 此外,如果您坚持使用当前架构,您可以尝试在 User.class 中的列表上方使用 @DBRef,如下所示:

public class ParentModel {

    @Id
    private String id;

    private String name;

    private ParentType parentType;

    private SubType subType;

    @DBRef
    private List<Model> models;

....
}

如果您在 User class 中使用 @DBRef 引用您的 Claim,您的 JSON 不仅应包含 ID,还应包含对集合的引用也可以找到 ID,如下所示:

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

这就是 Spring-Data 将您的 Java 对象映射到 MongoDB 的方式。如果您从一个空白数据库开始并让 Spring 创建并保存关系,那么使用

应该没有问题
 @DBRef List<Claim> claims;

作为@DBRef 的替代品,看看 RelMongo (link) 它提供了一种管理关系的强大方法,在您的情况下它将是这样的:

@OneToMany(fetch = FetchType.LAZY)
private list<Claim> claims;