如何在mongodb java spring中保存null dbref的对象?

时间:2014-10-27 15:41:17

标签: java spring mongodb spring-data spring-data-mongodb

我正在寻找在mongodb java spring框架中使用null 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();并通过存储库将此对象保存到mongodb,即aRepo.save(a)。然后,我有以下例外:

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

有没有办法用null dbref保存对象?

感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

docs:spring.io - DBRef

答案 2 :(得分:0)

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);

答案 3 :(得分:-1)

作为变体,您可以创建NullObject,如:

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

并使用它而不是null

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