Ответ 1
Вы используете @DBREF, поэтому вам нужно сначала создать объект B для DB. Вы можете сделать это:
B b = new B();
mongoOperations.save(b);
A a = new A();
a.setB(b)
mongoOperations.save(a);
Я ищу решение для сохранения объекта с нулевым dbref в mongodb java spring framework. Рассмотрим следующий пример:
@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.
Есть ли способ сохранить объект с нулевым dbref?
Спасибо за вашу помощь!
Вы используете @DBREF, поэтому вам нужно сначала создать объект B для DB. Вы можете сделать это:
B b = new B();
mongoOperations.save(b);
A a = new A();
a.setB(b)
mongoOperations.save(a);
Единственное решение состоит в том, чтобы удалить аннотацию @DBref
потому что @DBRef
- это аннотация, которая указывает, что аннотированное поле должно храниться с использованием DBRef.
документы: spring.io - DBRef
Dbref инкапсулирует извлечение данных из нескольких коллекций в стиле FOREGIN KEY
. Если вы используете @DBRef
для поля, это означает, что эта сущность уже сохранена, поэтому она должна иметь @Id
. Если вы хотите просто сохранить данные в объекте без перекрестной ссылки, просто удалите аннотацию @DBRef
.
Например, вот как ваши данные выглядят в mongodb с @DBRef
:
{
"_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);
В качестве варианта вы можете создать NullObject, например:
public final static B NULL_B = new B("");
и использовать его вместо null
public A() {
this.b = NULL_B;
}