ORM Flashcards

(12 cards)

1
Q

Проблема N + 1. Способы решения проблемы

A

Это проблема, когда мы получаем сущность, у которой еще N вложенных сущностей. При попытке получить такую сущность вместо 1 запроса мы сделаем 1 запрос и еще N запросов для вложенных сущностей.
Решение:
- JOIN FETCH. Это способ сказать Hibernate загрузить связанные данные вместе с основными (типа обычного JOIN-а).
- Использовать FetchType.EAGER вместо FetchType.LAZY.
- Использовать EntityGraph. Указываем, какие данные загружать в конкретных запросах, не изменяя сущности (как в случае с жадной загрузкой).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что такое Proxy и для чего используется?

A

Hibernate Proxy — это объект-заместитель (placeholder) для реального объекта, который загружается “лениво” (lazy loading). Это значит, что Hibernate создает прокси-объект вместо настоящего объекта из базы данных, и реальные данные загружаются только при первом доступе к ним. Это помогает оптимизировать производительность, загружая данные только тогда, когда они действительно нужны.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Кэширование

A
  • Кэш 1-го уровня:
    • Этот кэш всегда включен и работает на уровне сессии (у каждой сессии свой кэш и нельзя получить доступ к нему из другой сессии).
    • В кэше хранятся только сущности, у которых состояние persistent.
    • Отслеживаемые сущности (persistent) хранятся в мапе, где ключ - ID сущности, а значение - сами объекты-сущности.
    • При повторных запросах Hibernate использует кэшированные данные вместо выполнения нового запроса к базе данных.
    • При закрытии сессии кэш удаляется.
  • Кэш 2-го уровня:
    • Это дополнительный кэш, который надо включать вручную.
    • Работает на уровне SessionFactory.
    • Используется для кэширования данных между сессиями, что позволяет повторно использовать данные, уже загруженные из базы данных.
    • После закрытия SessionFactory весь кэш, связанный с ним, умирает.
  • Кэш 3-го уровня:
    • Кэширует результаты запросов на уровне SQL-запросов (кэширует результаты выборки).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое Hibernate, JPA, JDBC, ORM

A

Hibernate — это ORM Framework (один из самых распространённых JPA реализаций).
JPA — это спецификация Java, которая предоставляет набор интерфейсов и аннотаций.
ORM — процесс преобразования объектно-ориентированной модели в реляционную и наоборот.
JDBC — низкоуровневый API для взаимодействия с базами данных.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Жизненный цикл сущностей

A

1) New
2) Managed
3) Detached
4) Removed

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое EntityGraph?

A

Entity Graph — это механизм в JPA, который позволяет управлять стратегией загрузки данных, определяя, какие связанные сущности должны быть загружены сразу (eager) или отложенно (lazy). Это дает гибкость в выборе полей для загрузки в зависимости от запроса. Создается аннотацией @NamedEntityGraph на уровне сущности или динамически через API. EntityGraphы работают на уровне SQL-запросов, добавляя нужные JOIN-ы и выбирая необходимые поля.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

LazyInitializationException

A

Это происходит, когда объект был загружен с ленивой загрузкой, но его данные пытаются быть использованы после закрытия сессии.
Решение:
- JOIN FETCH. Это способ сказать Hibernate загрузить связанные данные вместе с основными (типа обычного JOIN-а).
- Использовать EntityGraph. Указываем, какие данные загружать в конкретных запросах, не изменяя сущности (как в случае с жадной загрузкой).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Как создать Entity и что это такое?

A

Это класс, помеченный аннотацией @Entity, нужен для маппинга Java-объектов в БД-объекты и наоборот. Она должна соответствовать следующим условиям:
- Должен иметь пустой конструктор.
- Не может быть вложенным, интерфейсом, ENUM или final.
- Не может содержать final полей.
- Хотя бы одно поле помечено аннотацией @Id.
- Аннотация @Entity над классом.
- Должен быть POJO (все поля private + getter-ы и setter-ы к ним).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Плюсы и минусы ORM

A

Плюсы:
- Позволяет бизнес-методам обращаться не к БД, а к Java-классам.
- Ускоряет разработку приложения.
- Основан на JDBC.
- Сущности основаны на бизнес-задачах, а не на структуре БД.
- Управление транзакциями.
Минусы:
- Потенциальная потеря производительности — автоматическая генерация SQL-запросов может быть менее оптимальной, чем ручное написание запросов.
- Сложные запросы — ORM плохо справляется с очень сложными SQL-запросами, такими как сложные агрегатные функции или многоуровневые JOIN’ы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

EntityManager + EntityManagerFactory / SessionFactory + session

A

Разница в том, где они используются:
EntityManager и EntityManagerFactory — это JPA.
Session и SessionFactory — Hibernate.
Session — основной интерфейс для взаимодействия с базой данных в Hibernate. Создается из SessionFactory.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Связи между таблицами ORM

A
  1. OneToOne
  2. OneToMany, ManyToOne
  3. ManyToMany
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Hibernate. Что хранится в Persistence Context? Сколько времени объект хранится в Persistence Context?

A

Persistence Context (контекст персистентности) в Hibernate — это хранилище, где управляемые сущности находятся в памяти в рамках одной транзакции или сессии. Оно выступает как промежуточный слой между объектами Java и базой данных, позволяя Hibernate отслеживать изменения объектов и синхронизировать их с базой данных.
В контексте персистентности хранятся:
- Управляемые сущности (managed entities): это объекты, которые были загружены из базы данных или сохранены в ней в текущей сессии. Hibernate отслеживает их для автоматической синхронизации с базой данных.
- Кэш первого уровня (First Level Cache): все управляемые сущности и их состояние сохраняются в кэше первого уровня, привязанном к конкретной сессии. Если вы запросите объект по первичному ключу, Hibernate сначала проверит наличие его в кэше, прежде чем выполнять SQL-запрос.
- Копии состояний объектов: Hibernate сохраняет начальное состояние объекта при его загрузке. Это используется для сравнения текущего состояния объекта и определения, были ли внесены изменения (dirty checking).
- Контроль идентичности: Hibernate гарантирует, что один и тот же объект не будет загружен дважды в пределах одной сессии.
- Отложенные запросы (Lazy Loading): Hibernate может хранить прокси-объекты для ленивой загрузки связанных сущностей. Эти прокси заменяются реальными объектами только при их использовании.
Сколько времени объект хранится в Persistence Context?
- До окончания сессии.
- До явного удаления (evict или clear).
- До того, как объект становится отсоединённым.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly