Hibernate кеш первого уровня отсутствует
Я новичок в кешировании JPA/Hibernate первого уровня.
У меня есть следующий класс хранилища
Каждый раз, когда я вызываю метод findByState (в рамках одной и той же транзакции), я вижу вывод SQL-запроса hibernate на консоль
public interface PersonRepository extends JpaRepository<PersonEntity, id> {
@Query("select person from PersonEntity p where name= (?1)")
List<PersonEntity> findByState(String state);
....
}
Я ожидал, что результаты будут кэшироваться кэшем первого уровня, а база данных не будет запрашиваться повторно.
Что я делаю неправильно?
2 ответа
Часто существует неправильное понимание о кэшировании.
Hibernate не кэширует запросы и результаты запросов по умолчанию. Кэш первого уровня используется только при вызове EntityManger.find()
Вы не увидите выполнение SQL-запроса. И кеш используется, чтобы избежать создания объекта, если объект уже загружается.
То, что вы ищете, называется "кеш запросов".
Это можно включить, установив hibernate.cache.use_query_cache=true
Пожалуйста, прочитайте больше об этой теме в официальной документации:
https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html
Запрос всегда будет идти в базу данных. Кэш первого уровня будет содержать только созданные объекты. Его цель - убедиться, что один и тот же идентификатор базы данных сопоставлен с одним и тем же объектом сущности (в рамках сеанса). Также возможно использовать кэш запросов. Вы должны включить для каждого запроса. Проверьте документы https://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch06.html