java - Spring Data JPA - 如何缓存实体,该实体包含在许多其他实体中

标签 java spring kotlin spring-data-jpa spring-cache

我使用 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 从数据库加载?

附注项目中大约有 40-50 个类别。

最佳答案

你想使用hibernate“二级缓存”

1 将二级缓存库之一添加到您的 pom.xml 中。我更喜欢 ehcache,但您可以使用任何其他。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <!--Your hibernate version-->
    <version>5.2.2.Final</version> 
</dependency>

2 启用二级缓存 持久化.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(...){
.........
}

这就是开始的全部内容。 Category会从DB中读取一次并存储在二级缓存中。下次 Hibernate 将从那里获取它,而不需要任何新的“选择”。

关于java - Spring Data JPA - 如何缓存实体,该实体包含在许多其他实体中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51984957/

相关文章:

android - 只需使用 CameraX 切换闪光灯

java - JBoss 7 启动失败

java - SpringBoot - 完全停用安全性以启用摘要转发

java - Spring Security, session 超时后创建 session 而无需登录

java - HTTP 状态 415 – 不支持的媒体类型错误

android - 如何通过ID删除recyclerview项目?

java - AspectJ 切入点到方法调用(即使它是在外部库上调用的)

java - 如何在 AssertJ 中为集合创建自定义断言

java - 如何将 jndi 数据源查找交换到内存数据库以进行集成测试?

java - Kotlin 中的 Spring 注入(inject)引用