Что такое Persistence Context в JPA/Hibernate?

«Что такое Persistence Context в JPA/Hibernate?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Persistence Context — это набор экземпляров сущностей (managed entities), жизненным циклом которых управляет провайдер JPA (например, Hibernate) в рамках определённой области видимости (обычно транзакции). Это кэш первого уровня (First-Level Cache).

Ключевые характеристики:

  • Отслеживание изменений: Все изменения, внесённые в управляемые сущности, автоматически детектируются и синхронизируются с БД при flush (явном вызове flush() или коммите транзакции).
  • Гарантия идентичности: В пределах одного контекста для данного первичного ключа гарантируется только один экземпляр сущности.
  • Область видимости:
    • Transaction-scoped (по умолчанию в JTA и RESOURCE_LOCAL): Контекст привязан к транзакции.
    • Extended: Контекст может жить дольше одной транзакции (используется в Stateful Session Beans).

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

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

// 1. Сущность становится MANAGED (загружена в контекст)
User user = em.find(User.class, 1L);

// 2. Изменения отслеживаются
user.setEmail("new@email.com");

// 3. Синхронизация с БД (UPDATE)
em.flush(); // Или em.getTransaction().commit();

// 4. Удаление из контекста -> состояние DETACHED
em.detach(user);
// Теперь изменения в 'user' не будут сохранены автоматически

em.getTransaction().commit();
em.close();

Практическое значение: Persistence Context — фундамент для автоматического управления состоянием сущностей, оптимизации запросов (избегание N+1) и работы с ленивой загрузкой (Lazy Loading).