Вы аккуратно расставили
FetchType.LAZY на всех *ToOne связях, уверены, что лишних запросов в БД нет — и тут в логах всплывает необъяснимый SELECT, который вы не просили. Особенно обидно, когда это
@OneToOne: на @ManyToOne ровно тот же LAZY работает железно и всегда, а здесь Hibernate вдруг идёт в базу eagerly, будто вашей аннотации и не было. А самое неприятное — большинство объяснений в сети сводятся к тому, что просто так уж устроено, но главный вопрос "Почему?" остается без ответа. Почему один и тот же
LAZY в одном случае работает, а в другом молча игнорируется?
В новой статье Михаил Поливаха, разбирает по полочкам:
☑️ Что на самом деле такое
FetchType.LAZY и почему это всего лишь hint, а не приказ;☑️ Почему
@OneToOne иногда невозможно сделать lazy именно в Java; ☑️ Почему
@ManyToOne при этом ленив всегда — и при чём тут владение связью и foreign key;☑️ Как с этим жить:
optional = false, дизайн схемы, @MapsId и другое.📎 Подробнее в статье на Хабр: https://habr.com/ru/companies/spring_aio/articles/1050462/
