2017-09-10 39 views
0

我发现没有被高速缓存,使一个非常简单的查询,如查询与内部对象在Hibernate中

 Session s = sessionFactory.getCurrentSession(); 
     List<Mod> list = s.createQuery("from Mod m where m.modNameShort=:modName") 
       .setParameter("modName", modName) 
       .setCacheable(true) 
       .list(); 

缓存很好。

但缓存不工作的一个一对多的选择,像这样:

List<ModVersion> list = s.createQuery("select m.modsVersionses from Mod m") 
       .setCacheable(true) 
       .list(); 

,也仍然感到对第二个及以后的调用请求DB。

 props.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider"); 
     props.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory"); 
     props.setProperty("hibernate.cache.use_second_level_cache", "true"); 
     props.setProperty("hibernate.cache.use_query_cache", "true"); 
     factoryBean.setHibernateProperties(props); 

,以及国防部物体看起来像

@Entity 
@Table(name = "mods", catalog = "artfunpw") 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
public class Mod implements java.io.Serializable { 
*** 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "mods") 
    @OrderBy("ReleaseDate desc") 
    public Set<ModVersion> getModsVersionses() { 
     return this.modsVersionses; 
    } 
*** 

的ModVersion物体看起来像

@Entity 
@Table(name = "mods_versions", catalog = "artfunpw", uniqueConstraints = @UniqueConstraint(columnNames = "VersionNumber")) 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
public class ModVersion implements java.io.Serializable { 

如何启用缓存对于这种一对多疑问?

谢谢!

+0

尝试增加'@在'OneToMany'方法Cache'注释即,'getModsVersionses' –

回答

0

可能,我的问题是重复的。

我找到答案在这里Using hibernate 2nd level cache or query cache for lazy fetch querieshttp://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#performance-cache-mapping

我应该补充@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

@OneToMany(fetch = FetchType.LAZY, mappedBy = "mods", cascade = {CascadeType.ALL}) 
    @OrderBy("ReleaseDate desc") 
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
    public Set<ModVersion> getModsVersionses() { 
     return this.modsVersionses; 
    }