与onetoone关联的JPA Hibernate EHCACHE问题 - QueryCache

时间:2011-02-23 13:06:10

标签: hibernate jpa ehcache

我有一个直接映射到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。这是一种预期的行为,或者我的配置有问题。

请帮助!!!

谢谢!

1 个答案:

答案 0 :(得分:1)

预期行为:查询缓存将返回实体的ID,而Hibernate将加载实体本身。因此,缓存查询查询的实体应位于第二级实体缓存中,以使操作有益。

这是the documentation

  

请注意

     

查询缓存不缓存   中的实际实体的状态   缓存;它只缓存标识符   价值类型的值和结果。对于   这个reaso,查询缓存应该   永远与...一起使用   这些实体的二级缓存   预计将被缓存为一部分   查询结果缓存(就像使用   集合缓存)。