Аннотации @Cache и @Cacheable в Hibernate
Аннотации @Cache и @Cacheable относятся к кешированию сущностей и коллекций в Hibernate. Они позволяют оптимизировать производительность за счёт хранения часто используемых данных в памяти, уменьшая количество обращений к базе данных.
@Cache (org.hibernate.annotations.Cache) – настраивает стратегию кеширования для сущности или коллекции.
@Cacheable (javax.persistence.Cacheable / jakarta.persistence.Cacheable) – указывает, что сущность может быть кеширована (используется вместе с @Cache).
@Cache (Hibernate)
Параметры:
usage (CacheConcurrencyStrategy) – стратегия кеширования:
READ_ONLY – только для чтения (если сущность не изменяется).
NONSTRICT_READ_WRITE – кеш обновляется асинхронно при изменениях.
READ_WRITE – гарантирует согласованность через мягкие блокировки.
TRANSACTIONAL – полная поддержка транзакций (для JTA).
region (опционально) – имя региона кеша (если используется несколько кешей, например, Ehcache, Hazelcast).
include (CacheInclude) – указывает, включать ли ленивые поля в кеш (ALL или NON_LAZY).
Пример:
@Cacheable (JPA)
Указывает, что сущность поддерживает кеширование.
Работает в паре с @Cache (Hibernate) или настройками JPA-провайдера.
Если @Cacheable(false), сущность игнорируется кешем, даже если кеширование включено глобально.
Пример:
Механизмы кеширования в Hibernate
Уровни кеширования
Кеш первого уровня (Session)
Автоматический, живет в рамках одной сессии (EntityManager).
Не требует @Cache.
Кеш второго уровня (SessionFactory)
Общий для всех сессий.
Требует явного объявления (@Cache + @Cacheable).
Кеш запросов (Query Cache)
Кеширует результаты JPQL/HQL-запросов.
Включается отдельно:
Настройка в Spring Boot
Включение кеша второго уровня
Указание кешируемых сущностей
Через @Cache + @Cacheable.
Или глобально в application.properties:
Настройка поставщика кеша
Например, для Ehcache:
Когда использовать?
@Cache + @Cacheable – для часто читаемых, редко изменяемых данных (справочники, настройки).
READ_ONLY – если сущности никогда не обновляются (например, Country, City).
READ_WRITE – если данные изменяются, но требуется высокая скорость чтения.
Избегать для часто изменяемых данных (кеш будет постоянно инвалидироваться).
#Java #Training #Hard #Spring #Hibernate #Cache #Cacheable
Аннотации @Cache и @Cacheable относятся к кешированию сущностей и коллекций в Hibernate. Они позволяют оптимизировать производительность за счёт хранения часто используемых данных в памяти, уменьшая количество обращений к базе данных.
@Cache (org.hibernate.annotations.Cache) – настраивает стратегию кеширования для сущности или коллекции.
@Cacheable (javax.persistence.Cacheable / jakarta.persistence.Cacheable) – указывает, что сущность может быть кеширована (используется вместе с @Cache).
@Cache (Hibernate)
Параметры:
usage (CacheConcurrencyStrategy) – стратегия кеширования:
READ_ONLY – только для чтения (если сущность не изменяется).
NONSTRICT_READ_WRITE – кеш обновляется асинхронно при изменениях.
READ_WRITE – гарантирует согласованность через мягкие блокировки.
TRANSACTIONAL – полная поддержка транзакций (для JTA).
region (опционально) – имя региона кеша (если используется несколько кешей, например, Ehcache, Hazelcast).
include (CacheInclude) – указывает, включать ли ленивые поля в кеш (ALL или NON_LAZY).
Пример:
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "employees")
public class Employee { ... }
@Cacheable (JPA)
Указывает, что сущность поддерживает кеширование.
Работает в паре с @Cache (Hibernate) или настройками JPA-провайдера.
Если @Cacheable(false), сущность игнорируется кешем, даже если кеширование включено глобально.
Пример:
@Entity
@Cacheable(true) // Включено кеширование (по умолчанию true)
public class Product { ... }
Механизмы кеширования в Hibernate
Уровни кеширования
Кеш первого уровня (Session)
Автоматический, живет в рамках одной сессии (EntityManager).
Не требует @Cache.
Кеш второго уровня (SessionFactory)
Общий для всех сессий.
Требует явного объявления (@Cache + @Cacheable).
Кеш запросов (Query Cache)
Кеширует результаты JPQL/HQL-запросов.
Включается отдельно:
spring.jpa.properties.hibernate.cache.use_query_cache=true
Настройка в Spring Boot
Включение кеша второго уровня
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
(Пример для Ehcache; также поддерживаются Infinispan, Hazelcast, Redis.)
Указание кешируемых сущностей
Через @Cache + @Cacheable.
Или глобально в application.properties:
spring.jpa.properties.javax.persistence.sharedCache.mode=ALL
(Варианты: ALL, NONE, ENABLE_SELECTIVE, DISABLE_SELECTIVE.)
Настройка поставщика кеша
Например, для Ehcache:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
И файл ehcache.xml в resources/.
Когда использовать?
@Cache + @Cacheable – для часто читаемых, редко изменяемых данных (справочники, настройки).
READ_ONLY – если сущности никогда не обновляются (например, Country, City).
READ_WRITE – если данные изменяются, но требуется высокая скорость чтения.
Избегать для часто изменяемых данных (кеш будет постоянно инвалидироваться).
#Java #Training #Hard #Spring #Hibernate #Cache #Cacheable