Как сохранить объект с нулевым dbref в mongodb java spring?

Я ищу решение для сохранения объекта с нулевым 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?

Спасибо за вашу помощь!

Ответ 1

Вы используете @DBREF, поэтому вам нужно сначала создать объект B для DB. Вы можете сделать это:

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

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

Ответ 2

Единственное решение состоит в том, чтобы удалить аннотацию @DBref потому что @DBRef - это аннотация, которая указывает, что аннотированное поле должно храниться с использованием DBRef.

документы: spring.io - DBRef

Ответ 3

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

Ответ 4

В качестве варианта вы можете создать NullObject, например:

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

и использовать его вместо null

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