1

我是 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);
    ....
}

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

我究竟做错了什么?

4

2 回答 2

6

对缓存经常存在误解。

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

于 2019-06-12T07:06:10.187 回答
1

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

于 2019-06-12T07:13:04.637 回答