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

Другие вопросы по тегам