Hibernate кеш первого уровня отсутствует - PullRequest
0 голосов
/ 12 июня 2019

Я новичок в кешировании 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 ]

4 голосов
/ 12 июня 2019

Часто возникает неверное представление о кэшировании.

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#caching-query

1 голос
/ 12 июня 2019

Запрос всегда будет идти в базу данных. Кэш первого уровня будет содержать только созданные объекты. Его цель - убедиться, что один и тот же идентификатор базы данных сопоставлен с одним и тем же объектом сущности (в сеансе). Также возможно использовать кеш запросов. Вы должны включить для каждого запроса. Проверьте документы https://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch06.html

...