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

时间:2018-08-23 11:38:50

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

我使用Spring Data JPA从存储库获取实体。我有一个名为Category的特定实体,可以包含在Offer,Project和User中。每次我从JpaRepository加载其中的某些实体时,Spring都会发出其他请求来获取Category。因此,合作伙伴实体如下所示:

@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 个答案:

答案 0 :(得分: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将从那里带走它,而无需任何新的“选择”。