我正在寻找在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保存对象?
感谢您的帮助!
答案 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;
}