我正在寻找一种解决方案,以在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保存为空?
感谢您的帮助!
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);
您正在使用@DBREF,因此需要首先创建对象B到DB。您可以这样做:
B b = new B();
mongoOperations.save(b);
A a = new A();
a.setB(b)
mongoOperations.save(a);
唯一的解决方案是删除@DBref
批注,因为@DBRef
是表示要使用DBRef存储带注释的字段的批注。
docs:spring.io - DBRef
作为变体,您可以像这样创建NullObject:
public final static B NULL_B = new B("");
并使用它而不是null
public A() {
this.b = NULL_B;
}