Chvalov
@Chvalov

Как вывести вложенные данные OneToMany?

Есть Entity класс:
@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private String method;

    private String url;
    @OneToMany
    private List<QueryParams> queryParams;

Проблема в том что на страницу отдается Json без данных QueryParams, вроде как есть, но пустыеE4qouxv.png
Controller:
@GetMapping("/find/{name}")
    public List<Test> find(@PathVariable String name) {
        return testService.findByName(name);
    }

    @GetMapping("get/{id}")
    public Optional<Test> gets(@PathVariable("id") Long id) {
        return testService.findById(id);
    }


При этом если выполнить в дебаге Evaluate Expression, то видно что данные приходят:5D44GVc.png
Что я пропустил ?
  • Вопрос задан
  • 626 просмотров
Решения вопроса 1
Conacry
@Conacry
Здравствуйте.
Для полного понимания не хватает кода вашего сервис-класса и dao-класса (при его наличии). На мой взгляд проблема в стратегии загрузки связанных объектов (@OneToMany).
В Hibernate/JPA существует два типа стратегии загрузки связанных объектов: сразу (FetchType=EAGER) или же делать это только при обращении к ним (FetchType=LAZY). На самом деле в случае, когда предметная область имеет сколь-либо сложную структуру связей между объектами, выбор уже сделан – загружать полбазы ради одного объекта, как это было бы при FetchType=EAGER, мягко говоря, неразумно. Поэтому ленивая инициализация в случае коллекций есть наиболее предпочтительная стратегия инициализации связанных объектов [https://habr.com/post/111911/]. По умолчанию для связи OneToMany используется FetchType=LAZY.
Так что проблема с загрузкой связанных объектов из базы данных.

В коде вашей модели необходимо добавить анноацию с выбором типа стратегии загрузки:
...
@OneToMany(fetch = FetchType.LAZY)
private List<QueryParams> queryParams;
...


А в классе-сервисе или DAO-классе перед
...
return testObject;
...
поставить строчку
Hibernate.initialize(testObject.getQueryParams);
В таком случае Hibernate загрузит все связанные объекты.
Если у вас остались вопросы, пишите, готов ответить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы