Spring数据MongoDB@DBRef为子类加载null

Spring数据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对象保存

我正在尝试保存一个包含@DBRef的对象,并将其加载到另一个恰好属于子类类型的对象,Spring Data MongoDB将该字段加载为null

班级人员{
@身份证
私人长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"
}
您可以尝试以下操作之一:

  • 使用@Document注释并显式命名集合以存储食物及其子类型,以便映射层可以正确设置$ref
  • @文件(“食品”)
    等级食品{
    @Id私人长Id;
    }
    
  • 使用MongoOperations#save保存食物。这样,每个子类都将在自己的集合中结束,从而允许解析“$ref”:“burger”
  • Christoph Strobl在报告中回答了这个问题。把他的答案贴在下面,以防有人发现。我个人选择了选项1来解决我的问题


    通过存储库持久化不同类型的食物使用存储库接口类型参数来确定实际的MongoDB集合。 在这种情况下,食物的所有子类型都将在食物集合中结束,除非它们通过@Document注释的collection属性显式重定向

    另一方面,人员存储库不知道食品存储库和食品收集的收集路线。因此,映射在Person#food中看到Burger实体,并创建对Burger集合的引用,该引用随后无法解析,从而导致您看到的空值

    {
        "_id" : 1,
        "food" : {
            "$ref" : "burger",
            "$id" : 1
        },
        "_class" : "Person"
    }
    
    您可以尝试以下操作之一:

  • 使用@Document注释并显式命名集合以存储食物及其子类型,以便映射层可以正确设置$ref
  • @文件(“食品”)
    等级食品{
    @Id私人长Id;
    }
    
  • 使用MongoOperations#save保存食物。这样,每个子类都将在自己的集合中结束,从而允许解析“$ref”:“burger”