Выбор ответа 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.

Варианты ответа

  1. MultipleBagFetchException: нельзя fetch-джойнить две bag-коллекцииправильный ответ
  2. Всё загрузится одним запросом без проблем и без дублей в коллекциях
  3. Hibernate молча проигнорирует второй join fetch и загрузит лениво
  4. Ошибка синтаксиса JPQL: два join fetch в одном запросе нельзя

Разбор

List без индекса в Hibernate это bag. Две bag-коллекции в одном fetch дают декартово произведение строк, и Hibernate не может однозначно разложить дубли, поэтому запрещает это исключением. Решения: загрузить коллекции отдельными запросами (вторым запросом с fetch по тем же id), использовать Set (но тогда декартово произведение всё равно раздует результат) или @BatchSize.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.