选择具有复合id的对象时的Hibernate查询缓存

时间:2010-11-03 21:55:57

标签: java hibernate caching criteria ehcache

我很难弄清楚如何在以下实体上有效使用查询缓存条件查询:

@Entity @Table(name = "category_configuration_values")
@Immutable
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class CategoryConfigurationValue implements Serializable {
    private static final long serialVersionUID = 3L;
    private static final Logger LOGGER = LoggerFactory.getLogger(CategoryConfigurationValue.class);

    @EmbeddedId
    private CategoryConfigurationValuePk primaryKey;

    @Column(name = "value")
    private String value;

    @Override
    public boolean equals(Object o) { ... }

    @Override
    public int hashCode() { ... }
}

@Embeddable
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
class CategoryConfigurationValuePk implements Serializable {
    private static final long serialVersionUID = 5068893389269876464L;

    @Column(name = "configuration_type_id")
    private int configurationTypeId;

    @Column(name = "category_id", columnDefinition = "smallint")
    private int categoryId;

    @Override
    public int hashCode() { ... }

    @Override
    public boolean equals(Object obj) { ... }

}

导致缓存未命中的标准之一是:

    Criteria criteria = getCurrentSession().createCriteria(CategoryConfigurationValue.class);
    criteria.setCacheable(true);
    criteria.setCacheRegion("query.AllConfigurationValuesForCategoriesAndAncestors");
    criteria.add(Restrictions.in("primaryKey.categoryId", categoryIds));

    List<CategoryConfigurationValue> allCategoryConfigurationValues = criteria.list();

第一次执行时我得到'in'查询:

Hibernate: select this_.category_id as category1_4_0_, this_.configuration_type_id as configur2_4_0_, this_.value as value4_0_ from category_configuration_values this_ where this_.category_id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

如果我再次执行它,我会得到很多以下内容,这对我来说看起来像缓存未命中:

    Hibernate: select categoryco0_.category_id as category1_4_0_, categoryco0_.configuration_type_id as configur2_4_0_, categoryco0_.value as value4_0_ from category_configuration_values categoryco0_ where categoryco0_.category_id=? and categoryco0_.configuration_type_id=?
Hibernate: select categoryco0_.category_id as category1_4_0_, categoryco0_.configuration_type_id as configur2_4_0_, categoryco0_.value as value4_0_ from category_configuration_values categoryco0_ where categoryco0_.category_id=? and categoryco0_.configuration_type_id=?
Hibernate: select categoryco0_.category_id as category1_4_0_, categoryco0_.configuration_type_id as configur2_4_0_, categoryco0_.value as value4_0_ from category_configuration_values categoryco0_ where categoryco0_.category_id=? and categoryco0_.configuration_type_id=?
Hibernate: select categoryco0_.category_id as category1_4_0_, categoryco0_.configuration_type_id as configur2_4_0_, categoryco0_.value as value4_0_ from category_configuration_values categoryco0_ where categoryco0_.category_id=? and categoryco0_.configuration_type_id=?
Hibernate: select categoryco0_.category_id as category1_4_0_, categoryco0_.configuration_type_id as configur2_4_0_, categoryco0_.value as value4_0_ from category_configuration_values categoryco0_ where categoryco0_.category_id=? and categoryco0_.configuration_type_id=?
...

我可以在这里找到什么?

1 个答案:

答案 0 :(得分:0)

虽然您已启用查询缓存,但您需要将类CategoryConfigurationValue显式添加为cachable,然后将该类的所有实例标记为cachable,这将解决您的问题..

  • Anantha Sharma