По умолчанию FetchType в Hibernate: One-to-One и One-to-Many
Быстрый ответ
@OneToOne // По умолчанию: fetch = FetchType.EAGER
private RelatedEntity otoEntity;
@ManyToOne // По умолчанию: fetch = FetchType.EAGER
private RelatedEntity mtoEntity;
@OneToMany // По умолчанию: fetch = FetchType.LAZY
private Set<RelatedEntity> otmEntities;
В Hibernate для отношений типа @OneToOne
и @ManyToOne
используется немедленная загрузка (иначе говоря, применяется стратегия жадной загрузки). Для отношений типа @OneToMany
вместо этого используется отложенная загрузка (данные запрашиваются по мере необходимости).
Принципы работы с типами загрузки
Понимание последствий выбора между жадной (EAGER
) и отложенной (LAZY
) стратегиями загрузки крайне важно. Если вам важно как можно скорее получить доступ ко всем связанным сущностям – выбирайте стратегию EAGER
. Если же вы хотите сэкономить ресурсы при первоначальной загрузке и готовы запрашивать данные по мере их нужды – воспользуйтесь стратегией LAZY
.
Переопределение стратегий загрузки
Hibernate предоставляет возможность переопределить стратегии загрузки, если вас не устраивают установленные по умолчанию:
@OneToMany(fetch = FetchType.EAGER)
private Set<RelatedEntity> otmEntities;
Работа с прокси
При использовании отложенной загрузки Hibernate применяет прокси, представляющие сущности. Это помогает сэкономить ресурсы, в частности, в случае редко используемых отношений One-To-One
и Many-To-One
.
Бережное отношение к выбору стратегии загрузки
Тщательно анализируйте и оценивайте выбранную стратегию загрузки, чтобы максимально повысить производительность вашего приложения. По умолчанию используйте LAZY загрузку и переключайтесь на EAGER только в случае наличия веской необходимости.
Настройка стратегий загрузки
Выбор подходящей стратегии загрузки — ключевой момент оптимизации. Изучите опции fetch=JOIN
и fetch=SELECT
, чтобы лучше понять, как можно настроить загрузку данных.
Выбор между 'join' и 'select'
При использовании fetch='JOIN'
возможно принудительное обращение Hibernate к загрузке связанных сущностей даже при значении lazy='true'
. С другой стороны, стратегия fetch='SELECT'
позволяет обращаться к связанным сущностям отдельно, что подходит для отложенной загрузки.
Изучение тонкостей работы с Hibernate
Для глубокого понимания работы Hibernate рекомендуется изучать и пользовательское руководство, и официальную документацию.
Понимание стандартных стратегий загрузки
По умолчанию для коллекций используется стратегия загрузки select
, для одиночных ассоциаций предпочтительнее join
.
Визуализация
Отношений в Hibernate можно сравнить с соседями в жилом комплексе:
OneToOne: 🏠 = 🏠
ManyToOne: 🏘️ → 🏠
OneToMany: 🏠 → 🏘️
Стандартные типы загрузки:
| Связь | Загрузка по умолчанию |
| ------------ | --------------------- |
| One-to-One | 🚪 LAZY |
| Many-to-One | 🏃 EAGER |
| One-to-Many | 🚪 LAZY |
Легенда:
- 🏠 Это сущность
- 🏘️ Это коллекция сущностей
- 🚪 Загрузка по требованию (LAZY)
- 🏃 Немедленная загрузка (EAGER)
Шпаргалка для разработчика
EAGER против LAZY: выбор имеет значение
Выбор между жадной и отложенной загрузкой влияет на производительность приложения. Основывайтесь на требованиях вашего проекта и на их влиянии на производительность при выборе стратегии.
Предотвращение проблем N+1 и LazyInitializationException
При использовании EAGER стоит остерегаться проблемы избыточных запросов, а LAZY может вызвать исключение LazyInitializationException, если сессия Hibernate будет закрыта до загрузки данных.
Все возможности Hibernate в вашем распоряжении
Максимально используйте возможности настройки стратегии загрузки данных путем применения пакетной загрузки и других функций, предоставляемых Hibernate.
Не забывайте обновлять свои знания
Следите за последними обновлениями Hibernate, чтобы оставаться в курсе и обновлять свои навыки.
Полезные материалы
- Hibernate – Annotations — детальное руководство по аннотациям Hibernate.
- Hibernate ORM 5.4.33.Final User Guide — официальное руководство пользователя Hibernate.
- Лучший способ отображения связей @OneToOne с JPA и Hibernate – Vlad Mihalcea — экспертные рекомендации по маппингу @OneToOne.
- Чем различаются FetchType LAZY и EAGER в Java Persistence API? – Stack Overflow — обсуждение различий FetchType на Stack Overflow.
- Hibernate — официальный форум для обсуждений Hibernate.
- Example ManyToOne JoinColumn Hibernate — практические примеры использования @ManyToOne и @JoinColumn.