Spring数据MongoDB@DBRef为子类加载null
我正在尝试保存一个包含@DBRef的对象,并将其加载到另一个恰好属于子类类型的对象,Spring Data MongoDB将该字段加载为nullSpring数据MongoDB@DBRef为子类加载null,mongodb,spring-data-mongodb,Mongodb,Spring Data Mongodb,我正在尝试保存一个包含@DBRef的对象,并将其加载到另一个恰好属于子类类型的对象,Spring Data MongoDB将该字段加载为null 班级人员{ @身份证 私人长id; @DBRef 私人食品; } 等级食品{ @身份证 私人长id; } 类汉堡扩展食品{} 我将分别保存对象: Burger-Burger=新汉堡(); 食物储存(汉堡); Person=新人(); 人、食物(汉堡); personRepository.save(person); 发生的情况是,burger对象保存
班级人员{
@身份证
私人长id;
@DBRef
私人食品;
}
等级食品{
@身份证
私人长id;
}
类汉堡扩展食品{}
我将分别保存对象:
Burger-Burger=新汉堡();
食物储存(汉堡);
Person=新人();
人、食物(汉堡);
personRepository.save(person);
发生的情况是,burger
对象保存在food
集合中,MongoDB中的\u class
值为burger
,Person文档中的$ref
指向burger
而不是food
个人
收藏:
{
"_id" : NumberLong(1),
"food" : {
"$ref" : "burger",
"$id" : NumberLong(2)
},
"_class" : "Person"
}
{
"_id" : NumberLong(2),
"_class" : "Burger"
}
食品
收集:
{
"_id" : NumberLong(1),
"food" : {
"$ref" : "burger",
"$id" : NumberLong(2)
},
"_class" : "Person"
}
{
"_id" : NumberLong(2),
"_class" : "Burger"
}
如果我使用findAll()
或findById()
加载对象,food
字段为空。但是如果我对burger对象使用findByFood()
,则返回person对象。我在这里没有正确理解什么
personRepository.findById(1L).getFood();//无效的
personRepository.findByFood(汉堡);//人客体
克里斯托夫·斯特罗布在报告中回答了这个问题。把他的答案贴在下面,以防有人发现。我个人选择了选项1来解决我的问题
通过存储库持久化不同类型的食物使用存储库接口类型参数来确定实际的MongoDB集合。 在这种情况下,食物的所有子类型都将在食物集合中结束,除非它们通过@Document注释的collection属性显式重定向 另一方面,人员存储库不知道食品存储库和食品收集的收集路线。因此,映射在Person#food中看到Burger实体,并创建对Burger集合的引用,该引用随后无法解析,从而导致您看到的空值
{
"_id" : 1,
"food" : {
"$ref" : "burger",
"$id" : 1
},
"_class" : "Person"
}
您可以尝试以下操作之一:
@文件(“食品”)
等级食品{
@Id私人长Id;
}
通过存储库持久化不同类型的食物使用存储库接口类型参数来确定实际的MongoDB集合。 在这种情况下,食物的所有子类型都将在食物集合中结束,除非它们通过@Document注释的collection属性显式重定向 另一方面,人员存储库不知道食品存储库和食品收集的收集路线。因此,映射在Person#food中看到Burger实体,并创建对Burger集合的引用,该引用随后无法解析,从而导致您看到的空值
{
"_id" : 1,
"food" : {
"$ref" : "burger",
"$id" : 1
},
"_class" : "Person"
}
您可以尝试以下操作之一:
@文件(“食品”)
等级食品{
@Id私人长Id;
}