我有一个直接映射到UI的实体,它有一些查找表,数据根本不会改变。在我的控制器中,我在查找表中使用findAll来获取所有值并将其设置为模型。
主要实体
@Entity
public class MainEntity implements Serializable {
@OneToOne(cascade = CascadeType.ALL, optional=true)
@JoinColumn(name="lookup_entity_key")
private LookupEntity luentity;
}
查找实体:
@Entity
@Table(name="lookup_entity")
@Cacheable
public class LookupEntity implements Serializable {
}
我在persistence.xml中启用了二级缓存。下面的配置
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />
<property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" />
FindALL查询缓存:
entityManager.createQuery("from " + this.entityClass.getName() )
.setHint("org.hibernate.cacheable", true)
.getResultList();
当请求来自UI时,它会尝试调用LookupEntity对象中的findAll方法。由于某种原因,第一个请求正确调用了findAll sql,但后续请求正在为LookupEntity中存在的所有行调用findById SQL。这是一种预期的行为,或者我的配置有问题。
请帮助!!!
谢谢!
答案 0 :(得分:1)
预期行为:查询缓存将返回实体的ID,而Hibernate将加载实体本身。因此,缓存查询查询的实体应位于第二级实体缓存中,以使操作有益。
请注意
查询缓存不缓存 中的实际实体的状态 缓存;它只缓存标识符 价值类型的值和结果。对于 这个reaso,查询缓存应该 永远与...一起使用 这些实体的二级缓存 预计将被缓存为一部分 查询结果缓存(就像使用 集合缓存)。