Spring Data Couchbase помещает атрибут @Id в json при внедрении

У меня есть отношение «один ко многим», а именно A и B. A может относиться ко многим экземплярам B. Экземплярами B также можно управлять независимо. Вот почему класс B выглядит так:

public class B {
    @Id
    private String id;
    private String appId;
}

Класс будет ссылаться на список экземпляров B. Так это выглядит так:

public class A {
    @Id
    private String id;
    private int age;
    private List<B> bInstances;
}

Когда bInstances заполняются экземплярами B, а затем сохраняется экземпляр A, поля id экземпляров B удаляются из документа JSON, поскольку он аннотируется с помощью @Id. Мне просто нужно добавить это поле в JSON, когда B встроен в другой класс. А когда экземпляр B сохраняется независимо, поле @Id можно использовать как обычный ключ. Как я могу это сделать?


person talhaocakci    schedule 27.09.2017    source источник


Ответы (2)


Чтобы конкретно ответить на ваш вопрос, да, поле с аннотацией @Id не будет записано в сериализованный json. Лучше всего здесь продублировать поле и установить его значение либо в конструкторе, либо в сеттере, например:

public class B {
@Id
private String metaId;
private String id;
private String appId; 

public setMetaId(String metaId) {
    this.metaId = metaId;
    this.id = metaId;
 }
}

Вы можете @JsonIgnore один из них, если не хотите видеть дублирование в своих сериализациях.

Примечание. Я полностью согласен с ответом Робина, но бывают случаи, когда вы хотите сохранить данные как есть и хотите ссылаться на них в будущем... поэтому вам все равно, изменился ли экземпляр B через неделю после вы сохранили данные. Так что это действительно зависит от вашего сценария.

person prettyvoid    schedule 04.10.2017

Я настоятельно рекомендую вам не хранить экземпляры B непосредственно в документе A. Это приведет к несогласованности данных, если экземпляр B будет изменен в контексте, отличном от A. Кроме того, вы дублируете данные. излишне, если экземпляр B хранится в нескольких документах класса A.

Желаемый способ хранения экземпляров одного класса в другом — вместо этого сохранить идентификаторы документов. Итак, ваш класс A должен выглядеть так:

public class A {
    @Id
    private String id;
    private int age;
    private List<String> bInstanceIds;
}
person Robin Ellerkmann    schedule 02.10.2017
comment
И что потом ? Самостоятельно создавать шаблон для получения поддокументов по идентификатору? Таким образом, нет реляционной аннотации, которую можно использовать, например @ManyToMany ? Или @DBRef в MongoDb - person Victor Petit; 30.11.2017