开发者

Hibernate query caching when selecting objects with composite id

I'm having a hard time figuring out how to make effective use of query caching criteria queries on the following entity:

@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) { ... }

}

The one of the criteria which is resulting in cache misses is:

    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();

The first time is is executed I get the 'in' query:

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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

If I execute it another time I get a lot of the following, which to me looks like cache misses:

    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=?
...

What could I be missing here?


eventhough you've enabled query caching, you need to explicitly add the class CategoryConfigurationValue as cachable, then all instances of the class is marked as cachable, this would solve your problem..

  • Anantha Sharma
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜