Ответ
Нет, использование кэша первого уровня (L1) в Hibernate не всегда обязательно и зависит от конкретного сценария. Он включен по умолчанию в рамках сессии (Persistence Context) и обеспечивает согласованность объектов в рамках одной транзакции.
Как работает L1 кэш: Он гарантирует, что повторное получение одной и той же сущности по идентификатору в рамках одной сессии не приведет к дополнительному SQL-запросу к базе данных.
// Первый вызов выполнит SELECT
User user1 = entityManager.find(User.class, 1L);
// Второй вызов вернет объект из L1 кэша, без запроса к БД
User user2 = entityManager.find(User.class, 1L);
assert user1 == user2; // true - это один и тот же экземпляр
Когда стоит отключить или очистить L1 кэш:
- Работа с большими объемами данных: Чтобы избежать утечек памяти (Memory Leak), когда в сессию загружается много объектов.
- Долгоживущие сессии (long-running): Например, в приложениях с открытой сессией на весь запрос (Open Session in View), чтобы не накапливать устаревшие данные.
- Требование актуальных данных: Когда необходимо гарантированно получить свежие данные из базы, минуя кэш.
Методы для управления L1 кэшем:
EntityManager entityManager = ...;
// Удалить конкретную сущность из кэша
entityManager.detach(user);
// Очистить весь кэш сессии
entityManager.clear();
// Обновить сущность из БД, перезаписав кэш
entityManager.refresh(user);
Вывод: L1 кэш — мощный механизм для оптимизации, но им нужно управлять осознанно, особенно в высоконагруженных или долгоживущих контекстах.