Как отключить ленивую загрузку в Hibernate? Я использую аннотации persistence, а не файл hbm xml.
Я извлекаю один объект по идентификатору и хочу, чтобы все свойства загружались. Сессия закрывается до того, как я использую объект.
Спасибо!
Ответ 1
Вам нужно аннотировать свойства, которые вы хотите использовать без использования функции FetchType.EAGER
@ManyToOne(fetch = FetchType.EAGER)
Понимаете, это не тот объект, который вы загружаете, который ленивый. Скорее, эти ассоциации объектов ленивы, и вам нужно сказать им, чтобы они не были, если это ваше желаемое поведение.
Если эти объекты также имеют ассоциации, которые вы хотите загружать с нетерпением, вам также необходимо их аннотировать.
Ответ 2
Вы можете указать fetch = FetchType.EAGER на всех ваших ассоциациях, рекурсивно, но это загрузит целую кучу данных, которые вам, вероятно, не интересуют.
Как правило, это лучшее решение, по крайней мере, для всех ассоциаций OneToMany и ManyToMany для LAZY (которые являются стандартными) и инициализации их перед закрытием сессии, если ваш прецедент нуждается в них (или даже загружает их с помощью ad-hoc запрос).
Ассоциации OneToOne и ManyToOne по умолчанию являются EAGER, и это уже часто вызывает слишком много запросов. Обычно я предпочитаю отмечать все ленивые, если только все прецеденты не нуждаются в ассоциации.
Ответ 3
Используйте fetch = FetchType.EAGER для всех коллекций и сущностей, которые вы хотите ленивы отключить.