Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 缺少Hibernate一级缓存_Java_Hibernate_Jpa_Spring Data Jpa_First Level Cache - Fatal编程技术网

Java 缺少Hibernate一级缓存

Java 缺少Hibernate一级缓存,java,hibernate,jpa,spring-data-jpa,first-level-cache,Java,Hibernate,Jpa,Spring Data Jpa,First Level Cache,我是JPA/Hibernate一级缓存的新手 我有以下存储库类 每次在同一事务中调用findByState方法时,我都会看到hibernate sql查询被输出到控制台上 public interface PersonRepository extends JpaRepository<PersonEntity, id> { @Query("select person from PersonEntity p where name= (?1)") List<Pers

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

我有以下存储库类

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

public interface PersonRepository extends JpaRepository<PersonEntity, id> {

    @Query("select person from PersonEntity p where name= (?1)")
    List<PersonEntity> findByState(String state);
    ....
}
我希望结果被第一级缓存缓存,并且数据库不会被重复查询


我做错了什么?

关于缓存,人们常常存在误解

默认情况下,Hibernate不缓存查询和查询结果。第一级缓存的唯一用途是在调用EntityManger.find时,不会看到SQL查询正在执行。如果实体已经加载,则缓存用于避免创建对象

您要查找的是查询缓存

这可以通过设置hibernate.cache.use\u query\u cache=true来启用

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


关于缓存,经常存在误解

默认情况下,Hibernate不缓存查询和查询结果。第一级缓存的唯一用途是在调用EntityManger.find时,不会看到SQL查询正在执行。如果实体已经加载,则缓存用于避免创建对象

您要查找的是查询缓存

这可以通过设置hibernate.cache.use\u query\u cache=true来启用

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


查询将始终转到数据库。第一级缓存将只包含构造的实体。其目的是确保相同的db id映射到会话中的相同实体对象
也可以使用查询缓存。您必须启用每个查询。检查文档

查询将始终转到数据库。第一级缓存将只包含构造的实体。其目的是确保相同的db id映射到会话中的相同实体对象
也可以使用查询缓存。您必须启用每个查询。检查文档

一级缓存是否与其会话关联。例如,如果您在一个会话中工作,并且两次命中同一查询,则将从一级缓存中检索数据,但当会话关闭时,缓存的数据将消失。请提供调用此方法的代码。对该方法的第二次调用是否在同一事务中?@jaspretjolly Yes,它在同一事务中。根据我的理解,一级缓存是默认缓存,并且没有禁用它的机制。因此,唯一的问题应该是调用是在两个不同的会话中进行的。一级缓存与其会话相关联。例如,如果您在一个会话中工作,并且两次命中同一查询,则将从一级缓存中检索数据,但当会话关闭时,缓存的数据将消失。请提供调用此方法的代码。对该方法的第二次调用是否在同一事务中?@jaspretjolly Yes,它在同一个事务中。根据我的理解,一级缓存是默认缓存,并且没有禁用它的机制。所以,唯一的问题应该是调用是在两个不同的会话中进行的。