Когда я перешагиваю через объекты hibnerate с помощью Intellij, объекты в окне отладки кажутся пустыми. Обозначается как $$_hibernate_interceptor
Итак, допустим, у меня есть простой код, который выглядит следующим образом
Subscription subscription = subscriptionRepository.getOne(1l);
log.info("add breakpoint debug code stopped here")
Я хотел бы увидеть, какие значения были возвращены из subscriptionRepository и присвоены объекту подписки в окне Debug:.
См. Снимок экрана, на котором показано, как это выглядит на моем компьютере.
Как вы можете видеть, большинство значений переменных кажутся пустыми, однако, если я сделаю toString () для объекта подписки, он выведет значения, которые помечены как null в окне приемника. Так что они не совсем пустые.
Итак, пара вопросов здесь
$$_hibernate_interceptorДальнейшие выводы
Перехватчик возвращается только тогда, когда я использую repository.getOne по умолчанию. Если я использую findBy или мой собственный findByField, он не вызывает перехватчик и отображает значения в окне отладки.
Что здесь происходит, почему getOne отображает перехватчик, а другие - нет?
Благодарим за отзыв. Итак, каковы были бы мои варианты просмотра объекта на панели отладки?
Я полагаю, вы могли бы использовать инструмент "оценить выражение" для вызова toString()? jetbrains.com/help/idea/evaluating-expressions.html




Как видите, тип вашей Подписки - Subscription$HibernateProxy$.... Это связано с тем, что Hibernate лениво загружает свойства из базы данных по мере их использования.
До первого обращения к ним, скажем, в toString(), они будут нулевыми.
Вы можете легко обойти это, добавив контрольную переменную (маленький значок +) в "subscription.toString ()".
Разница между findById и getOne заключается в том, что первый возвращает ленивый прокси, а второй использует быстро загруженный объект. Немного информации о том, почему можно найти здесь.
getOne()возвращает унифицированный прокси. В этом весь смысл этого метода. Вызов метода этого прокси (например, toString ()) - это то, что инициализирует прокси, то есть сообщает Hibernate, что нужно выполнить запрос и загрузить данные из базы данных. Итак, то, что вы видите, совершенно нормально и ожидаемо. Это происходит посредством генерации байт-кода, а перехватчик bytebuddy является (AFAIK) объектом, который будет перехватывать вызовы методов и инициализировать прокси.