Шаг отладчика Intellij по значениям объектов гибернации пуст

Когда я перешагиваю через объекты hibnerate с помощью Intellij, объекты в окне отладки кажутся пустыми. Обозначается как $$_hibernate_interceptor

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

Subscription subscription  = subscriptionRepository.getOne(1l);
log.info("add breakpoint debug code stopped here")

Я хотел бы увидеть, какие значения были возвращены из subscriptionRepository и присвоены объекту подписки в окне Debug:.

См. Снимок экрана, на котором показано, как это выглядит на моем компьютере.

Шаг отладчика Intellij по значениям объектов гибернации пуст

Как вы можете видеть, большинство значений переменных кажутся пустыми, однако, если я сделаю toString () для объекта подписки, он выведет значения, которые помечены как null в окне приемника. Так что они не совсем пустые.

Итак, пара вопросов здесь

  • Что такое $$_hibernate_interceptor

Дальнейшие выводы

Перехватчик возвращается только тогда, когда я использую repository.getOne по умолчанию. Если я использую findBy или мой собственный findByField, он не вызывает перехватчик и отображает значения в окне отладки.

Что здесь происходит, почему getOne отображает перехватчик, а другие - нет?

getOne() возвращает унифицированный прокси. В этом весь смысл этого метода. Вызов метода этого прокси (например, toString ()) - это то, что инициализирует прокси, то есть сообщает Hibernate, что нужно выполнить запрос и загрузить данные из базы данных. Итак, то, что вы видите, совершенно нормально и ожидаемо. Это происходит посредством генерации байт-кода, а перехватчик bytebuddy является (AFAIK) объектом, который будет перехватывать вызовы методов и инициализировать прокси.
JB Nizet 08.12.2018 19:28

Благодарим за отзыв. Итак, каковы были бы мои варианты просмотра объекта на панели отладки?

Robbo_UK 08.12.2018 23:22

Я полагаю, вы могли бы использовать инструмент "оценить выражение" для вызова toString()? jetbrains.com/help/idea/evaluating-expressions.html

Joe Halliwell 17.12.2018 11:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
3
2 140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как видите, тип вашей Подписки - Subscription$HibernateProxy$.... Это связано с тем, что Hibernate лениво загружает свойства из базы данных по мере их использования.

До первого обращения к ним, скажем, в toString(), они будут нулевыми. Вы можете легко обойти это, добавив контрольную переменную (маленький значок +) в "subscription.toString ()".

Разница между findById и getOne заключается в том, что первый возвращает ленивый прокси, а второй использует быстро загруженный объект. Немного информации о том, почему можно найти здесь.

Другие вопросы по теме