в этой ссылке, которую я упоминал ранее в комментарии, прочитайте эту часть:
Соединение «извлечение» позволяет инициализировать ассоциации или коллекции значений вместе с их родительскими объектами, используя один выбор. Это особенно полезно в случае коллекции. Он эффективно переопределяет внешние объединения и ленивые объявления файла сопоставления для ассоциаций и коллекций.
этот «JOIN FETCH» будет иметь эффект, если у вас есть свойство (fetch = FetchType.LAZY) для коллекции внутри сущности (пример ниже).
И это только эффект метода «когда должен произойти запрос». И вы должны также знать это :
Спящий режим имеет два ортогональных понятия: когда выбирается ассоциация и как она получается. Важно, чтобы вы их не путали. Мы используем fetch для настройки производительности. Мы можем использовать ленивый, чтобы определить контракт, для которого данные всегда доступны в любом отдельном экземпляре определенного класса.
когда выбирается ассоциация -> ваш тип "FETCH"
как это получается -> Присоединиться / выбрать / выбрать / пакет
В вашем случае, FETCH будет иметь эффект, только если у вас есть отдел как набор внутри Employee, что-то вроде этого в сущности:
@OneToMany(fetch = FetchType.LAZY)
private Set<Department> department;
когда вы используете
FROM Employee emp
JOIN FETCH emp.department dep
вы получите emp
и emp.dep
. когда вы не использовали fetch, вы все равно можете получить, emp.dep
но hibernate обработает другой выбор в базе данных, чтобы получить этот набор отделов.
так что это просто вопрос настройки производительности, о том, хотите ли вы получить весь результат (нужен он вам или нет) в одном запросе (активное получение) или вы хотите запросить его позже, когда вам это нужно (отложенное получение).
Используйте активную выборку, когда вам нужно получить небольшие данные одним выбором (один большой запрос). Или используйте ленивую выборку, чтобы запросить то, что вам нужно позже (много меньшего запроса).
использовать fetch, когда:
нет большой ненужной коллекции / набора внутри объекта, который вы собираетесь получить
связь между сервером приложений и сервером базы данных слишком велика и требует длительного времени
вам может понадобиться , что сбор последнего , когда у вас нет доступа к нему ( за пределы от транзакционного метода / класса)