#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();