Потеря дочерних данных в двунаправленном соотношении при использовании jacksonMapper

У меня есть два класса, как показано ниже, в двунаправленном соотношении Many to Many:

  Parent implements Serializable{

        @ManytoMany(//declaration for join table)
        @JsonBackReference
        @com.fasterxml.jackson.annotation.JsonIgnore
        Set <Child> childSet;

    }
    Child implements Serializable{
    @ManytoMany(//declaration for join table)
    @JsonManagedReference
    @com.fasterxml.jackson.annotation.JsonIgnore
    Set <Parent> parentSet;
    // other getter and setters
    }

Я делаю вызов в своем DAO, чтобы получить определенного родителя. Наряду с родительскими деталями я хочу получить дочерние элементы родителя. Что-то вроде этого:

   Hibernate.initialize(parent.getChildSet()); //this works perfectly
// and I get the details of parent along with the children in my DAO call.

Но когда я делаю ниже в своем бизнес-сервисе, возвращая данные контроллеру, дети опускаются из родительской строки json.

jacksonMapper.writeValueAsString(parent); 

Итак, я удалил атрибут @JsonIgnore on Child внутри родительского класса, думая, что Джексон может понять, что эти поля не должны игнорироваться при написании строки, как показано ниже. Но это все равно игнорирует их!: (

 Parent implements Serializable{

    @ManytoMany(//declaration for join table)
    @JsonBackReference
    //@com.fasterxml.jackson.annotation.JsonIgnore
    Set <Child> childSet;

}

Любая идея, где я могу ошибиться?

Ответ 1

Мне не удалось выяснить, почему это происходит. Тем временем я выбрал обходной путь. Я делаю два отдельных обращения к БД. Один для получения родительского первого, а затем второго для извлечения ребенка на основе выбранного родительского элемента.

В качестве альтернативы, я могу одновременно вызвать оба вызова БД в сервисе и подготовить JSON как сложную строку перед отправкой на ui:

complex:{
parent:parent,
child:child
}

В любом случае это обходное решение. Идеальное решение - просто удалить @JsonIgnore в сопоставлении только с родительской стороны для дочернего класса. Но почему-то это не работает. Я отправлю сообщение, если найду, почему "идеальное" решение не работает!

Идеальное решение Обновлено как ответ 15 августа 2016 года День независимости Индии:

Проблема заключается в отображении:

Parent implements Serializable{

        @ManytoMany(//declaration for join table)
        @JsonBackReference
        @com.fasterxml.jackson.annotation.JsonIgnore
        Set <Child> childSet;

    }

Когда вы говорите @JsonBackReference, на самом деле это означает игнорировать это поле при записи Json, то есть

@JsonBackReference ↔ @JsonIgnore

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

JsonManagedReference vs JsonBackReference