[英]Will HQL query use Hibernate 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;
}
地址的数据库表具有对客户 (id) 的外键引用,以支持一对多关系。
作为先决条件,我已将 Hibernate 的 2 级缓存启用为 EHcache。 只有实体和关联被设置为可缓存。 未启用查询缓存。
我知道,如果我多次使用 session.get() 或 session.load(),只有第一次调用会触发对数据库的查询,后续调用将从 2 级缓存中获取数据。
我的问题是
1)HQL会不会利用二级缓存。 在一个会话中,我执行了一个 HQL 以使用主键 (id) 获取对象,“来自 Customer c where c.id = ?”).setParameter(1, 1005)。
如果我在不同的会话中运行相同的 HQL,Customer 对象是从 2 级缓存中获取还是会再次访问数据库。
2) 考虑from Customer as c left join fetch c.addressList
执行的另一个 HQL from Customer as c left join fetch c.addressList
用于选择客户和关联的地址。
如果我在不同的会话中运行相同的 HQL,关联的地址会从 2 级缓存中获取还是会再次访问数据库。
由于您尚未启用Query Cache ,因此任何实体查询(JPQL 或 Criteria API)都不会使用二级缓存。 因此,这两个查询都将针对数据库执行。
如果您希望这些查询使用二级缓存,则可以启用查询缓存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.