Ответ
Persistence Context (Контекст персистентности) в Hibernate — это набор управляемых сущностей (managed entities), которые привязаны к конкретной сессии (Session) или контексту EntityManager (EntityManager) в JPA. Это ядро механизма ORM, отвечающее за синхронизацию состояния объектов с базой данных.
Ключевые характеристики:
- Отслеживание изменений (Dirty Checking): Hibernate автоматически отслеживает изменения в сущностях, находящихся в Persistence Context, и сохраняет их при коммите транзакции.
- Кеш первого уровня: Persistence Context действует как транзакционный кеш. Повторные запросы одной и той же сущности в рамках одной сессии возвращают один и тот же экземпляр объекта.
- Гарантия идентичности объекта: В рамках одного Persistence Context гарантируется, что для данной записи в БД будет существовать только один экземпляр объекта-сущности.
Жизненный цикл сущности относительно Persistence Context:
- Transient (Новая): Объект создан, но не ассоциирован с Persistence Context (
new). - Managed (Управляемая): Объект ассоциирован с Persistence Context (после
save(),persist(),merge(),find()). Изменения отслеживаются. - Detached (Отсоединенная): Сессия закрыта, но объект продолжает существовать. Изменения не отслеживаются.
- 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.