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;
我在编写允许以直接方式获取用户和声明详细信息的代码时遇到问题。这是我的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;