Java 如何使用HibernateEhcache缓存列表

Java 如何使用HibernateEhcache缓存列表,java,spring,hibernate,caching,ehcache,Java,Spring,Hibernate,Caching,Ehcache,我在我的web应用程序中使用HibernateEHCache model.put("projecttype",sessionfactory.getCurrentSession().createCriteria(TblProjectType.class).list()); System.out.println("Fetch Count="+ stats.getEntityFetchCount()); System.out.println("Second Level

我在我的web应用程序中使用HibernateEHCache

model.put("projecttype",sessionfactory.getCurrentSession().createCriteria(TblProjectType.class).list());
         System.out.println("Fetch Count="+ stats.getEntityFetchCount());
        System.out.println("Second Level Hit Count="+ stats.getSecondLevelCacheHitCount());
        System.out.println("Second Level Miss Count="+ stats.getSecondLevelCacheMissCount());
        System.out.println("Second Level Put Count="+ stats.getSecondLevelCachePutCount());
EHCACHE.xml

<cache
    name="com.uniphore.timesheet.domain.TblProjectType"
    maxElementsInMemory="1000"
    eternal="false"
    timeToIdleSeconds="300"
    timeToLiveSeconds="600"
    overflowToDisk="true" statistics="true"/>
TblProjectType table has 5 rows only.
我的电子课堂:

 @Entity
    @Table(name="tblProjectType")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @Repository
    public class TblProjectType  implements java.io.Serializable {

        private static final long serialVersionUID = -1798070786993154681L;
         @Id
         @GeneratedValue
         @Column(name ="ID")
         private short id;
         @Column(name ="TypeName")
         private String typeName;
         @Column(name="CreatedDate")
         private Date createdDate;
         @Column(name="ModifiedDate")
         private Date modifiedDate;
         @OneToMany(fetch = FetchType.LAZY, mappedBy = "tblProjectType", cascade = CascadeType.ALL)
         private Set<TblStage> tblStages = new HashSet<TblStage>(0);
         @OneToMany(fetch = FetchType.LAZY, mappedBy = "tblProjectType", cascade = CascadeType.ALL)
         private Set<TblProject> tblProjects = new HashSet<TblProject>(0);

        //getters and setters 



    }
@实体
@表(name=“tblProjectType”)
@缓存(用法=缓存并发策略。非严格读写)
@存储库
公共类TblProjectType实现java.io.Serializable{
私有静态最终长serialVersionUID=-1798070786993154681L;
@身份证
@生成值
@列(name=“ID”)
私人短id;
@列(name=“TypeName”)
私有字符串类型名;
@列(name=“CreatedDate”)
私人日期创建日期;
@列(name=“ModifiedDate”)
私人日期修改日期;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“tblProjectType”,cascade=CascadeType.ALL)
私有集tblStages=新哈希集(0);
@OneToMany(fetch=FetchType.LAZY,mappedBy=“tblProjectType”,cascade=CascadeType.ALL)
私有集tblProjects=新哈希集(0);
//接球手和接球手
}
每次put计数增加11。但没有其他值更改。为什么二级缓存不命中

为什么每次都执行查询而不是从二级缓存获取结果

为什么第二级put计数在我点击它应该更新而不是插入的同一个查询时增加? 任何帮助都将不胜感激

试试两件事

  • 在实体类中指定缓存区域

    @Entity
    @Table(name="tblProjectType")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region="yourcacheregion")
    @Repository
    public class TblProjectType  implements java.io.Serializable {
    }
    
  • 将条件查询标记为可缓存


    model.put(“projecttype”,sessionfactory.getCurrentSession().createCriteria(TblProjectType.class)…可设置缓存(true.list())

  • 我假设您有如下的hibernate配置

    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    <property name="hibernate.cache.use_query_cache" value="true"/>
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
    <property name="hibernate.generate_statistics" value="true"/>
    
    
    
    @madhesh此
    模型在这里做什么,以及如何缓存您的实体,QueryTBProject类型是我的实体类。我将该查询结果存储在缓存中。通过使用ehcache.xml,您是否已将TblProjectType实体标记为可缓存?发布您的TbProjectType类代码。@Andy Durfens,我已经将tblprojecttype标记为实体类。我已经在我的问题中发布了我的实体类。这很奇怪。我假设您同时启用了二级缓存和查询缓存。你也可以发布hibernate配置吗?是的,你的假设是正确的。但是我发现这个错误DummyPinnedKey不能被转换为org.hibernate.cache.QueryKey。我没有注意到你。什么时候出现错误?sessionfactory.getCurrentSession().createCriteria(TblProjectType.class).setCacheable(true).list()当尝试执行此查询时,我收到异常DummyPinnedKey无法转换为org.hibernate.cache.QueryKey未设置cacheable true时,您没有收到此异常?
    
    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    <property name="hibernate.cache.use_query_cache" value="true"/>
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
    <property name="hibernate.generate_statistics" value="true"/>