Java 缺少Hibernate一级缓存
我是JPA/Hibernate一级缓存的新手 我有以下存储库类 每次在同一事务中调用findByState方法时,我都会看到hibernate sql查询被输出到控制台上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
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,它在同一个事务中。根据我的理解,一级缓存是默认缓存,并且没有禁用它的机制。所以,唯一的问题应该是调用是在两个不同的会话中进行的。