Что такое кэш первого уровня (L1) в JPA EntityManager?

«Что такое кэш первого уровня (L1) в JPA EntityManager?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кэш первого уровня (L1 cache или session cache) в JPA — это кэш, автоматически поддерживаемый провайдером (например, Hibernate) в рамках одного экземпляра EntityManager (или Hibernate Session). Его основная цель — гарантировать консистентность объектов в пределах транзакции и избежать повторных запросов к БД для одного и того же объекта.

Ключевые свойства:

  • Привязан к сессии (EntityManager) — не разделяется между разными менеджерами.
  • Жизненный цикл равен жизненному циклу EntityManager. Очищается при вызове EntityManager.clear() или его закрытии.
  • Гарантирует, что для каждого идентификатора сущности в рамках сессии существует только один экземпляр объекта (identity map).

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

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

// Первый вызов выполняет SELECT и помещает сущность в L1 кэш
User user1 = em.find(User.class, 1L);

// Второй вызов возвращает тот же экземпляр из L1 кэша, запрос к БД не выполняется
User user2 = em.find(User.class, 1L);

System.out.println(user1 == user2); // true — это один и тот же объект

em.getTransaction().commit();
em.close(); // L1 кэш уничтожается