HQL查询是否会使用Hibernate二级缓存

时间:2014-06-21 13:41:14

标签: java hibernate jpa hql second-level-cache

我想澄清一些关于hibernate二级缓存的要点。需要澄清的是,HQL查询是否总是会访问数据库(至少是获取ID)。

考虑我们有实体

class Customer {

    long id;  // Primary key

    String name;

    set <Address> addressList;   // One to many relationship

}

class Address{

    long id; // Primary key

    String houseName;

}

Address的数据库表具有对Customer(id)的外键引用,以支持一对多关系。

作为前提条件,我已将hibernate的二级缓存启用为EHcache。仅将实体和关联设置为可缓存。未启用查询缓存。

我知道如果我多次使用session.get()或session.load(),只有第一次调用会向数据库发出查询,后续调用将从第2级缓存中获取数据。 / p>

我的问题是

1)HQL是否会利用二级缓存。 在一个会话中,我执行了一个HQL以使用主键(id)来获取对象,&#34;来自Customer c,其中c.id =? &#34;)。setParameter(1,1005)。

如果我在不同的会话中运行相同的HQL,那么Customer对象将从二级缓存中获取,还是会再次访问数据库。

2)考虑另一个执行from Customer as c left join fetch c.addressList的HQL,用于选择客户和相关地址。

如果我在不同的会话中运行相同的HQL,关联的地址是否会从二级缓存中获取,否则它将再次命中数据库。

1 个答案:

答案 0 :(得分:4)

由于您尚未启用查询缓存,因此任何实体查询都不会达到二级缓存。因此,两个查询都针对DB运行。

如果您希望这些查询使用二级缓存,则可以启用查询缓存。有关此主题的更多信息,请查看this article