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

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

Ответ

Persistence Context (Контекст персистентности) в Hibernate — это набор управляемых сущностей (managed entities), которые привязаны к конкретной сессии (Session) или контексту EntityManager (EntityManager) в JPA. Это ядро механизма ORM, отвечающее за синхронизацию состояния объектов с базой данных.

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

  • Отслеживание изменений (Dirty Checking): Hibernate автоматически отслеживает изменения в сущностях, находящихся в Persistence Context, и сохраняет их при коммите транзакции.
  • Кеш первого уровня: Persistence Context действует как транзакционный кеш. Повторные запросы одной и той же сущности в рамках одной сессии возвращают один и тот же экземпляр объекта.
  • Гарантия идентичности объекта: В рамках одного Persistence Context гарантируется, что для данной записи в БД будет существовать только один экземпляр объекта-сущности.

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

  1. Transient (Новая): Объект создан, но не ассоциирован с Persistence Context (new).
  2. Managed (Управляемая): Объект ассоциирован с Persistence Context (после save(), persist(), merge(), find()). Изменения отслеживаются.
  3. Detached (Отсоединенная): Сессия закрыта, но объект продолжает существовать. Изменения не отслеживаются.
  4. Removed (Удаленная): Объект помечен на удаление (delete(), remove()), будет удален из БД при коммите.

Пример работы:

// Открытие сессии и начало транзакции = создание Persistence Context
Session session = sessionFactory.openSession();
session.beginTransaction();

// 1. Получение сущности -> она становится MANAGED в Persistence Context
User user = session.get(User.class, 1L); // SELECT ...

// 2. Изменение MANAGED сущности -> изменение отслеживается
user.setName("Updated Name");

// 3. При коммите Hibernate автоматически выполняет UPDATE
// благодаря Dirty Checking в Persistence Context
session.getTransaction().commit(); // UPDATE user SET name=? WHERE id=?

// 4. Закрытие сессии -> Persistence Context уничтожается, сущность становится DETACHED
session.close();

Важно: Persistence Context существует только в рамках одной сессии/транзакции. Для долгоживущих контекстов в JPA используется PersistenceContextType.EXTENDED.