OneToMany связь Spring

136
12 июля 2019, 02:30

Имеется связь OneToMany, У одного Region есть много Districts. Имеется простой REST контроллер, который возвращает все Region, но ответ приходит

    {
    "id": 6,
    "name": "Test",
    "districts": null
}

Districts - null. Это неприятно.

    @GetMapping("/regions")
public ResponseEntity<List> getAllRegions() {
    return new ResponseEntity<>(regionService.getAllRegions(), HttpStatus.OK);
}

Юзаю JPA репозитории для доступа к данным в бд.

Часть Region

@OneToMany(mappedBy = "regions", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<District> districts;

Часть District

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "region_id")
private Region region;

В Бд у таблицы districts добавился столбец region_id в котором ID региона, к которому относится. Собственно сам вопрос, как мне вытягивать для GET маппинга Регионы, чтобы дистрикты тоже подгружались. Ну и забегая наперед, как мне добавлять POST маппингом дистрикты лучше? Пробовал

{
"name": "Distr",
"regionId": 1
}

Предварительно код подшаманив, в бд пишет все, вопросов нет. Указал явно ID Региона и название дистрикта, верно ли так?

P.S Понял, что проблема в FetchType, а точнее оно не подгружает все как надо. Если поменять на EAGER, идет

[{"id":1,"name":"Kiyv","districts":[{"id":7,"name":"qqqq","regions":{"id":1,"name":"Kiyv","districts":[{"id":7,"name":"qqqq","regions":{"id":1,"name":"Kiyv","districts

до stackoverflow, если сделать set дистриктов transient, то null.

Answer 1

Конечно, у вас ленивая подгрузка связей установлена нужен EAGER и маппинг в District у вас "region".

Измените на :

@OneToMany(mappedBy = "region", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<District> districts;

и все должно заработать, если остальное все настроено верно.

Или, если вы хотите Lazy, то можно подтянуть данные:

@Query("SELECT r FROM Region r JOIN FETCH r.districts WHERE r.id = (:id)")
Region findById(@Param("id") int id);

в вашем сервисе. И тода подтянутся остальные регионы.

Answer 2

Всем спасибо, советовали не в то направление. Всем, кто советовал EAGER - зачем, если мне нужно Lazy? Решил аннотацией @JsonIgnore над сетом дистриктов и все заработало

READ ALSO
бесконечный переворот матрицы на 90,-90,0 Java

бесконечный переворот матрицы на 90,-90,0 Java

Напишите программу, которая загружает матрицу и выполняет указанные преобразования указанного массива на 90, -90, 90 градусовПреобразования...

149
Добавление собственного Control в SceneBuilder (JavaFX)

Добавление собственного Control в SceneBuilder (JavaFX)

Можно ли добавить собственный элемент управления в SceneBuilder, что бы кроме стандартных (например TextField) в списке было MyTextField?

123
Подсчет уникальных чисел в массиве

Подсчет уникальных чисел в массиве

Программа должна подсчитывать уникальные чисел в массиве, например

124
Поиск повторяющихся чисел в графе

Поиск повторяющихся чисел в графе

Дан массив A длины (n+1), содержащий натуральные числа от 1 до nНайти любой повторяющийся элемент за время O(n), не изменяя массив и не используя...

136