Ответ
Кэш первого уровня (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 кэш уничтожается