如何在mongodb java spring中使用dbref为空的对象保存?

问题描述 投票:10回答:4

我正在寻找一种解决方案,以在mongodb java spring框架中保存具有空dbref的对象。考虑以下示例:

@Document
public class A {
    @Id
    private String id;
    @DBRef
    private B b;

    public A() {
        this.b = null;
    }

    ...
}

@Document
public class B {
    @Id
    private String id;
}

现在,如果我实例化A,即A a = new A();并通过存储库(即aRepo.save(a))将此对象保存到mongodb。然后,我有以下异常:

org.springframework.data.mapping.model.MappingException: Cannot create a reference to an object with a NULL id.

有没有一种方法可以使用dbref保存为空?

感谢您的帮助!

java spring mongodb spring-data spring-data-mongodb
4个回答
1
投票

Dbref封装了以FOREGIN KEY方式进行的多收集数据的获取。如果在字段上使用@DBRef,则意味着您已经存储了此实体,因此它必须具有@Id。如果只想将数据存储在没有交叉收集引用的对象中,则只需删除@DBRef批注。

例如,这是您的数据使用@DBRef在mongodb中的显示方式:

{
    "_id" : ObjectId("5bd1e18ee5adfb64cf7edc5c"),
    "b" : {
        "$ref" : "b",
        "$id" : ObjectId("5bd1e1b7e5adfb65f847159d")
    },
    "_class" : "namespace.A"
}

这就是没有@DBRef的样子

{
    "_id" : ObjectId("5bd1e18ee5adfb64cf7edc5c"),
    "b" : {
        "id" : "someid",
        "anotherfield" : "somevalue"
    },
    "_class" : "namespace.A"
}

这里是设置dbref字段的方法:

B b = bRepository.findById("someid").get();
A a = new A();
a.setB(b);
aRepository.save(a);

0
投票

您正在使用@DBREF,因此需要首先创建对象B到DB。您可以这样做:

B b = new B();
mongoOperations.save(b);

A a = new A();
a.setB(b)
mongoOperations.save(a);

0
投票

唯一的解决方案是删除@DBref批注,因为@DBRef是表示要使用DBRef存储带注释的字段的批注。

docs:spring.io - DBRef


-1
投票

作为变体,您可以像这样创建NullObject:

public final static B NULL_B = new B("");

并使用它而不是null

public A() {
    this.b = NULL_B;
}
© www.soinside.com 2019 - 2024. All rights reserved.