Избегайте отложенных свойств, извлекаемых в ResponseEntity - PullRequest
0 голосов
/ 31 января 2019

Я новичок в Spring, Hibernate, JPA и его API.Я создал @RestController, а связанный метод выглядит так:

@GetMapping("/user")
    public ResponseEntity getListItemById(){
        UserTypeEntity entity = userTypeRepository.findFirstByUserTypeId(1);    
        return ResponseEntity.ok().body(entity);    
    }

UserTypeEntity имеет 2 ленивых геттера,

@ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
    public UserEntity getUserByUserId() {
        return userByUserId;
    }

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_type_list_item_id", referencedColumnName = "list_item_id", nullable = false)
    public ListItemEntity getListItemByUserTypeListItemId() {
        return listItemByUserTypeListItemId;
    }

Все свойства ListItemEntity и UserEntity являются null до тех пор, пока я не использую JOIN FETCH запрос.Я проверил и подтвердил это.(Это может быть знакомо любому опытному).

Вот пример ответа, который я использую, чтобы получить,

Response

(Извините, он даже не может быть отформатирован из-за большого отклика данных, хотя у меня в каждой таблице по одной строке. Это бесконечная рекурсия (StackOverflowError))

Все загружается в конце концов.Я не мог определить, что, черт возьми, происходит не так здесь.Почему эти ленивые нулевые свойства загружены, и я получил этот странный и расплывчатый ответ?Я потратил на это целый день, помогите, пожалуйста, выбраться из этого.

1 Ответ

0 голосов
/ 31 января 2019

Переместите свои аннотации из объявления получателя в поле, и вы увидите непротиворечивые результаты.

После вашего редактирования: @ShreeKrishna, это была моя точка зрения.Теперь я могу дать четкое объяснение, что это ожидаемое поведение.Отладчик показывает, какие поля на самом деле есть, и они будут, и БУДУТ нулевыми, поскольку ваш ленивый триггер инициализации находится в методе GETTER, а не в поле.Поэтому не обращайте внимания на то, что показывает вам отладчик, пока вы будете получать доступ к своим свойствам через геттеры вместо прямого доступа - у вас все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...