Найти в Дзене
Записки о Java

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

Если вы работаете с Java-приложениями, использующими базы данных, вы наверняка сталкивались с такими терминами, как Persistence, EntityManager, @PersistenceContext и кэш первого уровня. Но что именно означает Persistence в контексте Hibernate? Это действительно кэш первого уровня? И как это связано с аннотацией @PersistenceContext в Spring? В этой статье мы разберёмся во всех этих понятиях. Persistence (персистентность) — это свойство объекта сохранять своё состояние между перезапусками приложения. В контексте ORM (Object-Relational Mapping), такого как Hibernate, persistence означает управление жизненным циклом сущностей (entity objects) относительно базы данных. То есть, когда мы говорим “объект персистентный”, мы имеем в виду, что: 📌 Важно: Persistence — это не кэш первого уровня. Это состояние объекта. Кэш первого уровня — это инструмент, который Hibernate использует для обеспечения персистентности. Вы упомянули, что, возможно, Persistence — это кэш первого уровня. Это распростран
Оглавление
Рисунок: Persistence в Hibernate
Рисунок: Persistence в Hibernate

Введение

Если вы работаете с Java-приложениями, использующими базы данных, вы наверняка сталкивались с такими терминами, как Persistence, EntityManager, @PersistenceContext и кэш первого уровня. Но что именно означает Persistence в контексте Hibernate? Это действительно кэш первого уровня? И как это связано с аннотацией @PersistenceContext в Spring?

В этой статье мы разберёмся во всех этих понятиях.

Что такое Persistence?

Persistence (персистентность) — это свойство объекта сохранять своё состояние между перезапусками приложения. В контексте ORM (Object-Relational Mapping), такого как Hibernate, persistence означает управление жизненным циклом сущностей (entity objects) относительно базы данных.

То есть, когда мы говорим “объект персистентный”, мы имеем в виду, что:

  • Он связан с текущей сессией Hibernate (или EntityManager в JPA).
  • Любые изменения в этом объекте будут автоматически синхронизированы с базой данных при коммите транзакции.
  • Hibernate отслеживает его состояние (dirty checking).

📌 Важно: Persistence — это не кэш первого уровня. Это состояние объекта. Кэш первого уровня — это инструмент, который Hibernate использует для обеспечения персистентности.

Кэш первого уровня — это не Persistence

Вы упомянули, что, возможно, Persistence — это кэш первого уровня. Это распространённое заблуждение.

Что такое кэш первого уровня?

Кэш первого уровня (L1 Cache) — это внутренний кэш, привязанный к текущей сессии Hibernate (или EntityManager). Он:

  • Автоматически включён.
  • Хранит все загруженные/сохранённые сущности в рамках одной сессии.
  • Обеспечивает, что в пределах одной сессии на один и тот же ID будет возвращён один и тот же объект (identity guarantee).
  • Уничтожается вместе с закрытием сессии.
Рисунок: пример работы кэша первого уровня в Hibernate
Рисунок: пример работы кэша первого уровня в Hibernate

Как это связано с Persistence?

Кэш первого уровня — это механизм, который помогает Hibernate:

  • Избегать лишних запросов к БД.
  • Обеспечивать согласованность состояния объектов.
  • Реализовывать паттерн Identity Map.

Но сам по себе он не является персистентностью. Персистентность — это концепция управления состоянием объекта, а кэш — лишь её часть.

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

Hibernate определяет 4 состояния сущности:

  1. Transient — объект создан, но не связан с сессией. Не имеет ID (или ID не соответствует записи в БД).
  2. Persistent — объект связан с сессией. Hibernate отслеживает его изменения.
  3. Detached — объект был персистентным, но сессия закрыта. Изменения не отслеживаются.
  4. Removed — объект помечен для удаления, будет удалён при коммите.

Пример:

User user = new User("John"); // Transient

session.persist(user); // Теперь Persistent

session.close(); // Теперь Detached

Что такое @PersistenceContext в Spring?

Аннотация @PersistenceContext не имеет прямого отношения к кэшу первого уровня или состоянию persistence. Это инструмент внедрения зависимости, предоставляемый Spring для получения экземпляра EntityManager.

Как это работает?

@PersistenceContext

private EntityManager entityManager;

Spring внедряет прокси-объект EntityManager, который:

  • Привязан к текущей транзакции (если используется @Transactional).
  • Использует текущую сессию Hibernate (под капотом).
  • Управляет кэшем первого уровня в рамках сессии.

То есть, @PersistenceContext — это способ получить доступ к механизму персистентности, но не сам механизм.

Заключение

Persistence в Hibernate — это не кэш первого уровня. Это состояние объекта, при котором он управляется сессией и его изменения автоматически синхронизируются с БД. Кэш первого уровня — это внутренний механизм Hibernate, который помогает эффективно управлять этими объектами.

Аннотация @PersistenceContext в Spring — это просто способ получить EntityManager, который, в свою очередь, предоставляет доступ к механизму персистентности и кэшу первого уровня.