【问题标题】:Spring Data MongoDB @DBRef Loads null for child classSpring Data MongoDB @DBRef 为子类加载 null
【发布时间】:2020-07-22 16:47:40
【问题描述】:

我正在尝试将包含 @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 而不是 @987654329 @。

person收藏:

{
    "_id" : NumberLong(1),
    "food" : {
        "$ref" : "burger",
        "$id" : NumberLong(2)
    },
    "_class" : "Person"
}

food收藏:

{
    "_id" : NumberLong(2),
    "_class" : "Burger"
}

如果我使用findAll()findById() 加载对象,则food 字段为空。但是,如果我将 findByFood() 与 burger 对象一起使用,则会返回 person 对象。我在这里没有正确理解什么?

personRepository.findById(1L).getFood(); // null
personRepository.findByFood(burger);     // Person object

【问题讨论】:

    标签: mongodb spring-data-mongodb


    【解决方案1】:

    Christoph Strobl 在Spring Data MongoDB JIRA board 中回答了这个问题。在下面粘贴他的答案,以防有人发现。我个人选择了选项 1 来解决我的问题。


    通过 Repository 保存不同类型的 Food 使用 Repository 接口类型参数来确定实际的 MongoDB 集合。 在这种情况下,所有 Food 子类型都将最终出现在 food 集合中,除非它们通过 @Document 注释的集合属性显式重定向。

    另一方面,Person 存储库不知道 Food Repository 和到 food 集合的集合路由。因此,映射在 Person#food 中看到 Burger 实体并创建对 burger 集合的引用,然后无法解析,导致您看到 null 值。

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

    您可以尝试以下方法之一:

    1. 使用@Document注解并显式命名集合来存储Food及其子类型,以便映射层可以正确设置$ref。
    @Document("food")
    class Food {
        @Id private long id;
    }
    
    1. 使用 MongoOperations#save 保存食物。这样一来,每个子类都会在自己的集合中结束,从而可以解析 "$ref" : "burger"。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2017-10-31
      • 2015-10-31
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多