Java Hibernate二级缓存并非在所有情况下都使用

Java Hibernate二级缓存并非在所有情况下都使用,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,使用SpringBoot2、SpringDataJPA和Hibernate。我试图对一些从未更新过的实体使用Hibernate的二级缓存 在我的例子中,实体DocumentType与其他实体相关,因此当查询一种文档类型时,Hibernate将进行4次sql查询。 使用Hibernate二级缓存时,缓存用于某些实体,但仍有一个对数据库的sql查询。 我想了解为什么在一种情况下不使用缓存 这就是我的实体的外观: @实体 @表(name=“文件类型”) @可缓存 @org.hibernate.anno

使用SpringBoot2、SpringDataJPA和Hibernate。我试图对一些从未更新过的实体使用Hibernate的二级缓存

在我的例子中,实体
DocumentType
与其他实体相关,因此当查询一种文档类型时,Hibernate将进行4次sql查询。 使用Hibernate二级缓存时,缓存用于某些实体,但仍有一个对数据库的sql查询。 我想了解为什么在一种情况下不使用缓存

这就是我的实体的外观:

@实体
@表(name=“文件类型”)
@可缓存
@org.hibernate.annotations.Cache(用法=cacheconcurrentystrategy.READ_ONLY)
公共类文档类型{
@身份证
私人长id;
@纵队
私有字符串代码;
@OneToOne(cascade={CascadeType.ALL})
私人翻译;
@org.hibernate.annotations.Cache(用法=cacheconcurrentystrategy.READ_ONLY)
@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name=“business”,joinColumns=@JoinColumn(name=“document\u type\u id”))
@枚举(EnumType.STRING)
@列(name=“business”)
私营企业;
@manytone(cascade={CascadeType.ALL})
@JoinColumn(name=“equality\u id”)
私有等价;
@实体
@表(name=“等效”)
@可缓存
@org.hibernate.annotations.Cache(用法=cacheconcurrentystrategy.READ_ONLY)
公共类等价{
@身份证
私人长id;
@org.hibernate.annotations.Cache(用法=cacheconcurrentystrategy.READ_ONLY)
@OneToMany(mappedBy=“equality”,fetch=FetchType.EAGER)
私有列表文档类型列表;
首次使用此方法获取文档类型时:

@存储库
公共接口DocumentTypeRepository扩展了JpaRepository{
DocumentType findBySubtypeCode(字符串子类型代码);
我有以下会话度量:

    1704919 nanoseconds spent preparing 4 JDBC statements;
    33284024 nanoseconds spent executing 4 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    2983589 nanoseconds spent performing 4 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    1313315 nanoseconds spent performing 3 L2C misses;
第二次获取的相同文档类型提供:

    27855 nanoseconds spent preparing 1 JDBC statements;
    4348289 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    14421 nanoseconds spent performing 1 L2C puts;
    182655 nanoseconds spent performing 3 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;

我希望第二次有0条JDBC语句,但事实并非如此。

只有当实体通过其ID检索时,二级缓存才有效,可以使用
EntityManager.find(…)
,也可以在JPA需要检索相关实体时在内部使用。默认情况下,查询结果从不缓存

您需要的是和
org.hibernate.cacheable
查询提示。或者,您可以启用Spring缓存并使用
@cacheable
@CachePut
注释