Hibernate предоставляет (как минимум) два варианта решения проблемы N + 1.Один из них устанавливает FetchMode на Subselect, который генерирует выбор с предложением IN и выбором внутри этого предложения IN.Другой - указать BatchSize, который генерирует выбор с предложением IN, содержащим идентификаторы родителей.
Оба работают, но я считаю, что опция Subselect часто сталкивается с проблемами производительности из-за запроса для родителейбыть сложным.С другой стороны, с большим BatchSize (скажем, 1000) число запросов и сложность этих запросов очень малы.
Мой вопрос таков: когда вы будете использовать Hibernate Subselect FetchMode вместо BatchSize?Подвыбор, вероятно, имеет смысл, если у вас есть очень большое количество родительских записей (тысяч), но есть ли другие сценарии, в которых вы бы предпочли Подвыбор BatchSize?
РЕДАКТИРОВАТЬ: я заметил разницу междуиметь дело с нетерпеливой загрузкой.Если у вас есть ассоциация xToMany, загружаемая с энтузиазмом и через подвыбор, она генерирует подвыбор, как если бы она была ленивой.Однако, если вы укажете BatchSize, сгенерированный запрос использует внешнее соединение, а не отдельный запрос.Есть ли способ заставить Hibernate использовать отдельный пакетный запрос при загрузке с нетерпением?