Ответ
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).