HQL查询将使用Hibernate二级缓存吗

San*_*cko 3 java hibernate jpa hql second-level-cache

我想澄清一些有关休眠的二级缓存的要点。需要澄清的一点是,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;

}
Run Code Online (Sandbox Code Playgroud)

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

前提是,我已将2级缓存启用为EHcache休眠。仅实体和关联设置为可缓存。没有启用查询缓存。

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

我的问题是

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

如果我在不同的会话中运行了相同的HQL,则将从2级缓存中获取Customer对象,否则它将再次访问数据库。

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

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

Vla*_*cea 5

因为您尚未启用查询缓存,所以没有实体查询(JPQL或Criteria API)将使用第二级缓存。因此,两个查询都将针对数据库执行。

如果希望这些查询改为使用第二级缓存,则可以启用查询缓存。查看本文以获取有关此主题的更多信息。