Почему мы должны использовать @Cacheable, а также @Cache в режиме гибернации для кэша второго уровня?

#java #hibernate #jpa #caching #ehcache

#java #спящий режим #jpa #кэширование #ehcache

Вопрос:

Я хочу знать, почему мы должны использовать 2 аннотации для использования кэша второго уровня в режиме гибернации.

Мы объявляем :

 @Cacheable
@Cache
 

Почему мы не объявляем напрямую @Cache с помощью опций?

Комментарии:

1. Я считаю @Cacheable , что это аннотация Spring для кэширования любого набора данных, независимо от того, получены они из базы данных или нет.

2. Можете ли вы дать больше контекста? В какой документации / примере говорится, что вы должны использовать обе аннотации? Не могли бы вы также привести минимальный пример кода, а не только две аннотации? Какую версию Hibernate и JPA вы используете?

Ответ №1:

Я хочу знать, почему мы должны использовать 2 аннотации для использования кэша второго уровня в режиме гибернации.

Вам не нужно использовать оба, но вы можете.
@Cache это интерфейс кэша гибернации.
@Cacheable это интерфейс кэша JPA.
@Cacheable будет работать, только если для элемента кэширования( persistence.xml ) установлено значение ENABLE_SELECTIVE или DISABLE_SELECTIVE .

Согласно этому: некоторые разработчики считают, что хорошим соглашением является добавление стандартного @javax.persistence .Также кэшируемая аннотация (хотя и не требуется в режиме гибернации).

Почему мы не объявляем напрямую @Cache с параметрами?

Это именно то, что вы должны сделать. Базовая конфигурация кэша второго уровня (я использую Spring Boot):

 //In build.gradle:
implementation 'org.hibernate:hibernate-ehcache' //If you are specifying a version, make sure that it is the same version as your Hibernate version you are using.

//Hibernate properties(can also be externalized to application.properties):
properties.put("hibernate.cache.use_second_level_cache", "true"); //hibernate.cache.use_second_level will also work
properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");

//In the entity class:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class MyClass implements Serializable {
 

Примечание 1: В приведенном выше примере используется Ehcache 2.x
Примечание 2: коллекции по умолчанию не кэшируются, вам нужно явно пометить их @Cache .

БОНУС:
Если вы хотите проверить статистику:

 //Add this property:
properties.put("hibernate.generate_statistics", "true");

//And somewhere in your code:
sessionFactory.getStatistics();