Выбор ответа Senior Hibernate: N+1, lazy, кеш обновлено
Две коллекции в join fetch
Вопрос
Запрос select u from User u join fetch u.orders join fetch u.roles, обе коллекции типа List. Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: MultipleBagFetchException: нельзя fetch-джойнить две bag-коллекции. List без индекса в Hibernate это bag.
Варианты ответа
- MultipleBagFetchException: нельзя fetch-джойнить две bag-коллекцииправильный ответ
- Всё загрузится одним запросом без проблем и без дублей в коллекциях
- Hibernate молча проигнорирует второй join fetch и загрузит лениво
- Ошибка синтаксиса JPQL: два join fetch в одном запросе нельзя
Разбор
List без индекса в Hibernate это bag. Две bag-коллекции в одном fetch дают декартово произведение строк, и Hibernate не может однозначно разложить дубли, поэтому запрещает это исключением. Решения: загрузить коллекции отдельными запросами (вторым запросом с fetch по тем же id), использовать Set (но тогда декартово произведение всё равно раздует результат) или @BatchSize.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.