Короткий ответ
Кэширование в Hibernate хранит часто запрашиваемые данные в памяти, уменьшая обращения к базе. Кэш первого уровня (First-Level Cache, Session Cache) включён по умолчанию и привязан к конкретной Session: повторно запрошенный в той же сессии объект возвращается из памяти без запроса к БД. Кэш второго уровня (Second-Level Cache, SessionFactory Cache) — общий для всех сессий фабрики; по умолчанию выключен и требует явной настройки.
Как это работает подробнее
Разница — в границе действия. Первый уровень живёт в пределах одной Session: он обеспечивает согласованность данных на уровне транзакции, но недоступен другим сессиям. Второй уровень действует на уровне всего приложения, поддерживает параллельный доступ нескольких сессий и может хранить данные не только в памяти, но и во внешнем хранилище.
- Первый уровень: всегда включён, не настраивается, хранится в памяти сессии.
- Второй уровень: опционален и конфигурируем: подключается провайдер кэша (например, Ehcache или Redis), включается свойство
hibernate.cache.use_second_level_cache, а сущности помечаются аннотацией@Cache. - Query Cache: отдельно хранит результаты запросов, работает только вместе со включённым кэшем второго уровня; запрос помечается как кэшируемый через
setCacheable(true).
Пример кода
Session session = sessionFactory.openSession();
session.beginTransaction();
Book book1 = session.get(Book.class, 1L); // запрос к БД
Book book2 = session.get(Book.class, 1L); // объект из кэша первого уровня
session.getTransaction().commit();
session.close();Что использовать на практике
- Полагайтесь на кэш первого уровня как на бесплатную оптимизацию в рамках одной сессии.