首页 > 解决方案 > Hibernate 二级缓存总是在获取所有实体时调用数据库

问题描述

我通过添加以下配置在我的 sprint boot 2.1.8 应用程序中启用了休眠二级缓存:

spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

我还添加了eh缓存依赖,如下所示:

     <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>5.3.11.Final</version>
    </dependency>

我将一个实体注释为可缓存:

@Entity(name = "entity")
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "entity")
@AttributeOverride(name = "id", column = @Column(name = "entity_id"))

    public class Entity extends ItemBase {
        private String n1;
        private String n2;
        private String n3;
        private int n4;
        @Column(name = "n_5")
        private int n5;
  //getters and setters
        }

每次我调用存储库类(扩展 JpaCrudRepository)并调用 findAll(); 或 findOneById(),我看到休眠日志 HQL 查询和数据库实际上被调用。

期望的行为是从数据库中获取一次实体列表并将它们保存在缓存中,在那里它们应该使用读写策略进行更新。

知道如何实现吗?

标签: javaspringhibernatespring-bootcaching

解决方案


推荐阅读