ORM Flashcards
(12 cards)
Проблема N + 1. Способы решения проблемы
Это проблема, когда мы получаем сущность, у которой еще N вложенных сущностей. При попытке получить такую сущность вместо 1 запроса мы сделаем 1 запрос и еще N запросов для вложенных сущностей.
Решение:
- JOIN FETCH. Это способ сказать Hibernate загрузить связанные данные вместе с основными (типа обычного JOIN-а).
- Использовать FetchType.EAGER вместо FetchType.LAZY.
- Использовать EntityGraph. Указываем, какие данные загружать в конкретных запросах, не изменяя сущности (как в случае с жадной загрузкой).
Что такое Proxy и для чего используется?
Hibernate Proxy — это объект-заместитель (placeholder) для реального объекта, который загружается “лениво” (lazy loading). Это значит, что Hibernate создает прокси-объект вместо настоящего объекта из базы данных, и реальные данные загружаются только при первом доступе к ним. Это помогает оптимизировать производительность, загружая данные только тогда, когда они действительно нужны.
Кэширование
- Кэш 1-го уровня:
- Этот кэш всегда включен и работает на уровне сессии (у каждой сессии свой кэш и нельзя получить доступ к нему из другой сессии).
- В кэше хранятся только сущности, у которых состояние persistent.
- Отслеживаемые сущности (persistent) хранятся в мапе, где ключ - ID сущности, а значение - сами объекты-сущности.
- При повторных запросах Hibernate использует кэшированные данные вместо выполнения нового запроса к базе данных.
- При закрытии сессии кэш удаляется.
- Кэш 2-го уровня:
- Это дополнительный кэш, который надо включать вручную.
- Работает на уровне SessionFactory.
- Используется для кэширования данных между сессиями, что позволяет повторно использовать данные, уже загруженные из базы данных.
- После закрытия SessionFactory весь кэш, связанный с ним, умирает.
- Кэш 3-го уровня:
- Кэширует результаты запросов на уровне SQL-запросов (кэширует результаты выборки).
Что такое Hibernate, JPA, JDBC, ORM
Hibernate — это ORM Framework (один из самых распространённых JPA реализаций).
JPA — это спецификация Java, которая предоставляет набор интерфейсов и аннотаций.
ORM — процесс преобразования объектно-ориентированной модели в реляционную и наоборот.
JDBC — низкоуровневый API для взаимодействия с базами данных.
Жизненный цикл сущностей
1) New
2) Managed
3) Detached
4) Removed
Что такое EntityGraph?
Entity Graph — это механизм в JPA, который позволяет управлять стратегией загрузки данных, определяя, какие связанные сущности должны быть загружены сразу (eager) или отложенно (lazy). Это дает гибкость в выборе полей для загрузки в зависимости от запроса. Создается аннотацией @NamedEntityGraph на уровне сущности или динамически через API. EntityGraphы работают на уровне SQL-запросов, добавляя нужные JOIN-ы и выбирая необходимые поля.
LazyInitializationException
Это происходит, когда объект был загружен с ленивой загрузкой, но его данные пытаются быть использованы после закрытия сессии.
Решение:
- JOIN FETCH. Это способ сказать Hibernate загрузить связанные данные вместе с основными (типа обычного JOIN-а).
- Использовать EntityGraph. Указываем, какие данные загружать в конкретных запросах, не изменяя сущности (как в случае с жадной загрузкой).
Как создать Entity и что это такое?
Это класс, помеченный аннотацией @Entity, нужен для маппинга Java-объектов в БД-объекты и наоборот. Она должна соответствовать следующим условиям:
- Должен иметь пустой конструктор.
- Не может быть вложенным, интерфейсом, ENUM или final.
- Не может содержать final полей.
- Хотя бы одно поле помечено аннотацией @Id.
- Аннотация @Entity над классом.
- Должен быть POJO (все поля private + getter-ы и setter-ы к ним).
Плюсы и минусы ORM
Плюсы:
- Позволяет бизнес-методам обращаться не к БД, а к Java-классам.
- Ускоряет разработку приложения.
- Основан на JDBC.
- Сущности основаны на бизнес-задачах, а не на структуре БД.
- Управление транзакциями.
Минусы:
- Потенциальная потеря производительности — автоматическая генерация SQL-запросов может быть менее оптимальной, чем ручное написание запросов.
- Сложные запросы — ORM плохо справляется с очень сложными SQL-запросами, такими как сложные агрегатные функции или многоуровневые JOIN’ы.
EntityManager + EntityManagerFactory / SessionFactory + session
Разница в том, где они используются:
EntityManager и EntityManagerFactory — это JPA.
Session и SessionFactory — Hibernate.
Session — основной интерфейс для взаимодействия с базой данных в Hibernate. Создается из SessionFactory.
Связи между таблицами ORM
- OneToOne
- OneToMany, ManyToOne
- ManyToMany
Hibernate. Что хранится в Persistence Context? Сколько времени объект хранится в Persistence Context?
Persistence Context (контекст персистентности) в Hibernate — это хранилище, где управляемые сущности находятся в памяти в рамках одной транзакции или сессии. Оно выступает как промежуточный слой между объектами Java и базой данных, позволяя Hibernate отслеживать изменения объектов и синхронизировать их с базой данных.
В контексте персистентности хранятся:
- Управляемые сущности (managed entities): это объекты, которые были загружены из базы данных или сохранены в ней в текущей сессии. Hibernate отслеживает их для автоматической синхронизации с базой данных.
- Кэш первого уровня (First Level Cache): все управляемые сущности и их состояние сохраняются в кэше первого уровня, привязанном к конкретной сессии. Если вы запросите объект по первичному ключу, Hibernate сначала проверит наличие его в кэше, прежде чем выполнять SQL-запрос.
- Копии состояний объектов: Hibernate сохраняет начальное состояние объекта при его загрузке. Это используется для сравнения текущего состояния объекта и определения, были ли внесены изменения (dirty checking).
- Контроль идентичности: Hibernate гарантирует, что один и тот же объект не будет загружен дважды в пределах одной сессии.
- Отложенные запросы (Lazy Loading): Hibernate может хранить прокси-объекты для ленивой загрузки связанных сущностей. Эти прокси заменяются реальными объектами только при их использовании.
Сколько времени объект хранится в Persistence Context?
- До окончания сессии.
- До явного удаления (evict или clear).
- До того, как объект становится отсоединённым.