Атрибут fetchType определяет, будет ли аннотированное поле извлекаться сразу же, когда выбирается основной объект. Он не обязательно диктует, как создается оператор fetch, фактическая реализация sql зависит от поставщика, которого вы используете toplink / hibernate и т. Д.
Если вы установите fetchType=EAGER
Это означает, что аннотированное поле заполняется его значениями одновременно с другими полями в сущности. Таким образом, если вы откроете entitymanager, получите ваши объекты person, а затем закроете entitymanager, последующее выполнение person.address не приведет к возникновению исключения отложенной загрузки.
Если вы установите fetchType=LAZY
, поле заполняется только при обращении к нему. Если вы закроете entitymanager к тому времени, будет добавлено исключение отложенной загрузки, если вы введете person.address. Чтобы загрузить поле, вам нужно поместить сущность обратно в контекст entitymangers с помощью em.merge (), затем выполнить доступ к полю и затем закрыть entitymanager.
Возможно, вы захотите ленивую загрузку при создании класса клиента с коллекцией для заказов клиентов. Если вы получили каждый заказ для клиента, когда хотели получить список клиентов, это может быть дорогостоящей операцией с базой данных, когда вы ищете только имя клиента и контактные данные. Лучше оставить доступ к БД на потом.
Для второй части вопроса - как получить спящий режим для генерации оптимизированного SQL?
Hibernate должен позволять вам давать подсказки о том, как построить наиболее эффективный запрос, но я подозреваю, что с вашей конструкцией таблицы что-то не так. Установлены ли отношения в таблицах? Возможно, Hibernate решил, что простой запрос будет быстрее, чем объединение, особенно если отсутствуют индексы и т. Д.