Spring Data JPA - Как кэшировать объект, который включен во многие другие объекты

Я использую 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 категорий.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 063
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите использовать спящий режим "кеш второго уровня"

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 возьмет его оттуда, без какого-либо нового «выбора из».

Другие вопросы по теме