当前位置: 首页 > 知识库问答 >
问题:

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

汪鸿志
2023-03-14

我试图将一个包含@dbref的对象保存并加载到另一个恰好是子类类型的对象,并且Spring Data MongoDB将该字段加载为NULL。

class Person {
    @Id
    private long id;
    @DBRef
    private Food food;
}

class Food {
    @Id
    private long id;
}

class Burger extends Food {}
Burger burger = new Burger();
foodRepository.save(burger);

Person person = new Person();
person.setFood(burger);
personRepository.save(person);

发生的情况是,burger对象保存在food集合中,并且MongoDB中的_class值为burger并且Person文档中的$ref指向burger而不是food

人员集合:

{
    "_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(); // null
personRepository.findByFood(burger);     // Person object

共有1个答案

公冶鸣
2023-03-14

Christoph Strobl在Spring Data MongoDB JIRA板上回答了这个问题。把他的答案贴在下面以防有人发现。我个人选择了方案1来解决我的问题。

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

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

{
    "_id" : 1,
    "food" : {
        "$ref" : "burger",
        "$id" : 1
    },
    "_class" : "Person"
}

您可以尝试以下操作之一:

  1. 使用@document注释并显式命名集合以存储Food和it子类型,以便映射层可以正确设置$ref。
@Document("food")
class Food {
    @Id private long id;
}
 类似资料:
  • 我试图使用在模型中创建一个列表,但我无法使其工作。这是我的用户模型: 服务器型号: 结构非常简单,每个用户可以有多个服务器。但是,当我向用户添加服务器时,服务器就创建了,但是servers数组包含一个条目()。因此服务器不会添加到用户中。这就是我如何创建服务器并将其添加到用户: 所以我只需创建并保存一个服务器,将服务器添加到用户,然后保存用户。但不管用。我一直有一个数组,其中有一个项。 我所有的库

  • 我有一个实体Market(Market存储在marketDb数据库中的集合中)引用Product(存储在productDb数据库中的集合产品中)。 /**市场在集合中存储为:*/ 当我尝试通过Id读取市场时,我能够获取市场,但产品返回为NULL。 然而:1。如果product存储在与Market属于同一数据库的集合中,则product将作为read on Market的一部分返回。2.如果在上述代

  • 我得到com.mongodb.MongoWaitQueueFullExc0019。Mongo版本-4.2,Spring Data MongoDB版本-3.6 如何增加泳池大小?将增加池大小将为我工作,目前,我在docker容器内的单个节点上运行mongo。 例外情况:- org.springframework.data.mongodb.UnzzizedMongoDb异常:太多的线程已经在等待连接。

  • 我写代码时遇到了麻烦,这将允许以一种简单明了的方式获取用户和索赔细节。这是我的MongoDB结构, 我的实体类是: 索赔类别: 我有一种方法可以按名称获取用户,如下所示, 如果我尝试使用这个方法,会得到一个错误, 找不到能够从类型<code>org.bson.types转换的转换器。ObjectId以键入 所以我更改了我的用户实体类,如下所示, 而不是

  • 是否可以使用或任何其他文件在数据库中加载初始数据? 我知道用于数据库,而是数据库。但只是想知道数据库的是否有任何等价物。 在谷歌搜索时,我发现了这个SO链接(Spring Boot加载初始数据),它完成了我所要查找的内容,但它仍然不是一个独立的文件。

  • 我写了这个程序spring boot mongodb reactive 依赖项: 应用。道具文件: 我的代码在此链接中运行良好: 但是在这个链接中: 代码引发以下错误: 导致此错误的原因是DBRef注释,它根本不起作用。它引发以下异常。我们可以添加这样的配置使其工作吗?提前谢谢你