Я использую Spring Data JPA для получения сущностей из репозиториев. У меня есть конкретная сущность под названием Категория, которую можно включить в предложение, проект и пользователя. Каждый раз, когда я загружаю некоторые из этих сущностей из JpaRepository, Spring делает другие запросы для получения категории. Итак, сущность Партнера выглядит так:
@Entity
class Project(...) {
constructor() : this(...)
@Id
var id: String = IDGenerator.longId()
@ManyToMany
var categories: MutableList<Category> = mutableListOf()
@ManyToOne
var mainCategory: Category? = null
//other fiels
}
Категория выглядит так:
@Entity
class Category(var name: String,
var icon: String) {
constructor() : this("", "")
@Id
var id: String = IDGenerator.longId()
var marker: String = "default-category.png"
@ElementCollection
var defaultImg: MutableList<String> = mutableListOf("default.jpg")
}
Как кешировать категории и загружать их не из БД, а по ID?
P.S. В проекте всего около 40-50 категорий.




Вы хотите использовать спящий режим "кеш второго уровня"
1 Добавьте одну из кеш-библиотек второго уровня в свой pom. Я предпочитаю ehcache, но вы можете использовать любой другой.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<!--Your hibernate version-->
<version>5.2.2.Final</version>
</dependency>
2 Включите кеш второго уровня persistence.xml
<properties>
...
<property name = "hibernate.cache.use_second_level_cache" value = "true"/>
<property name = "hibernate.cache.region.factory_class"
value = "org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
...
</properties>
или вы можете сделать это в application.properties
spring.data.jpa.hibernate.cache.use_second_level_cache=true
spring.data.jpa.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
3 Добавьте аннотацию @Cacheable к своей сущности.
@Entity
@Cacheable
class Category(...){
.........
}
Это все для начала. Категория будет считана из БД один раз и сохранена в кеш-памяти второго уровня. В следующий раз Hibernate возьмет его оттуда, без какого-либо нового «выбора из».