【发布时间】:2017-09-10 11:42:23
【问题描述】:
我发现,一个非常简单的查询,比如
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);
,Mod 对象看起来像
@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 {
如何为这种一对多查询启用缓存?
谢谢!
【问题讨论】:
-
尝试在
OneToMany方法上添加@Cache注解,即getModsVersionses