繁体   English   中英

HQL查询会不会使用Hibernate二级缓存

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM