Hibernate二级缓存问题

时间:2011-03-24 21:00:45

标签: java hibernate caching

我有多对一的关系,假设用户有公司。公司实体没有任何其他关系。

如果我为公司的findAll hibernate查询启用二级缓存,第二次重新加载页面(这意味着加载了用户,然后还加载了所有公司的列表)我为每个现有公司选择(选择..来自hibernate输出中id =?)的公司。 调用findAll for Company时会发生这种情况,它看起来像这样(这是类中的泛型方法,使用适当的类型进行扩展):

return (List<T>) getHibernateTemplate().execute(new HibernateCallback() {

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria c = session.createCriteria(persistentClass);
                c.setCacheable(cacheFindAll);

                return c.list();
            }
        });

我在只读策略中使用Jboss TreeCacheProvider。如果我使用setCacheable(false),则没有“不需要的”选择。

为什么会发生这种情况?如何消除这种行为?

1 个答案:

答案 0 :(得分:6)

电话 setCacheable() 用于启用查询缓存,请参阅javadoc

Enable caching of this query result, provided query caching is enabled for the underlying session

公司的ID是缓存的,而不是对象本身。如果启用二级缓存,则这些单独的公司查询将由二级缓存处理。

为了启用二级缓存,您需要在persistence.xml中设置hibernate.cache.use_second_level_cache = true。此外,您需要注释您想要在二级缓存中缓存的关系和实体。

@OneToMany
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
private List<Company> companies;

实体缓存:

@Entity
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Company {
    ...
}

BTW二级缓存只会缓存你在id上找到的关系和实体。查询不能由二级缓存缓存,并且将始终转到数据库(或查询缓存)。