错过了休眠一级缓存

时间:2019-06-12 06:07:13

标签: java hibernate jpa spring-data-jpa first-level-cache

我是JPA / Hibernate一级缓存的新手。

我有以下存储库类

每次调用findByState方法(在同一事务中)时,我都会看到休眠sql查询输出到控制台上

public interface PersonRepository extends JpaRepository<PersonEntity, id> {

    @Query("select person from PersonEntity p where name= (?1)")
    List<PersonEntity> findByState(String state);
    ....
}

我希望结果将由一级缓存缓存,并且不会重复查询数据库。

我在做什么错了?

2 个答案:

答案 0 :(得分:4)

通常对缓存有误解。

默认情况下,Hibernate不缓存查询和查询结果。一级缓存唯一使用的是当您调用EntityManger.find()时,您将看不到执行SQL查询。如果实体已经加载,则使用缓存来避免创建对象。

您要查找的内容称为“查询缓存”。

这可以通过设置hibernate.cache.use_query_cache=true

来启用

请在官方文档中阅读有关此主题的更多信息:

https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#caching-query

答案 1 :(得分:1)

查询将始终转到数据库。一级缓存将仅包含构造的实体。其目的是确保将相同的数据库ID映射到相同的实体对象(在会话中) 也可以使用查询缓存。您必须启用每个查询。检查文档https://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch06.html