← Назад ко всем вопросам

Какие знаешь FetchType в Hibernate

1️⃣ Как кратко ответить

В Hibernate существуют два типа FetchType: LAZY и EAGER. LAZY откладывает загрузку связанных данных до момента их непосредственного обращения, что экономит ресурсы. EAGER загружает все связанные данные сразу при выполнении запроса, что может быть полезно для предотвращения дополнительных запросов.

2️⃣ Подробное объяснение темы

В Hibernate, как и в других ORM (Object-Relational Mapping) фреймворках, FetchType определяет, как и когда связанные сущности загружаются из базы данных. Это важно для управления производительностью приложения и эффективного использования ресурсов.

FetchType.LAZY

LAZY загрузка откладывает извлечение связанных данных до тех пор, пока они не понадобятся. Это означает, что когда вы загружаете объект из базы данных, связанные объекты не загружаются сразу. Они будут загружены только при первом обращении к ним.

Пример использования:

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
​
    private String name;
​
    @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
    private List<Book> books;
}
  • @Entity: Аннотация, указывающая, что класс является сущностью.
  • @Id и @GeneratedValue: Указывают, что поле id является первичным ключом и его значение будет автоматически генерироваться.
  • @OneToMany: Указывает на отношение "один ко многим" между Author и Book.
  • fetch = FetchType.LAZY: Указывает, что книги (books) будут загружены только при первом обращении к ним.

Преимущества LAZY:

  • Экономия ресурсов, так как данные загружаются только при необходимости.
  • Уменьшение времени начальной загрузки объекта.

Недостатки LAZY:

  • Возможность возникновения LazyInitializationException, если сессия Hibernate закрыта до обращения к связанным данным.

FetchType.EAGER

EAGER загрузка означает, что все связанные данные загружаются сразу при выполнении запроса. Это может быть полезно, если вы знаете, что вам понадобятся все связанные данные, и хотите избежать дополнительных запросов к базе данных.

Пример использования:

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
​
    private String name;
​
    @OneToMany(mappedBy = "author", fetch = FetchType.EAGER)
    private List<Book> books;
}
  • fetch = FetchType.EAGER: Указывает, что книги (books) будут загружены сразу вместе с автором.

Преимущества EAGER:

  • Удобство, так как все необходимые данные доступны сразу.
  • Избежание LazyInitializationException.

Недостатки EAGER:

  • Потенциально более высокая нагрузка на базу данных и потребление памяти, так как загружается больше данных, чем может быть необходимо.
  • Увеличение времени начальной загрузки объекта.

Применение и выбор FetchType

Выбор между LAZY и EAGER зависит от конкретного сценария использования. Если вы не уверены, что вам понадобятся все связанные данные, или если их может быть много, лучше использовать LAZY. Если же вы точно знаете, что все данные понадобятся, и хотите избежать дополнительных запросов, используйте EAGER. Важно помнить, что неправильный выбор FetchType может привести к проблемам с производительностью или ошибкам в работе приложения.

Тема: Spring/Spring-экосистема
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки