HQL查询会使用Hibernate二级缓存吗?

3
我希望澄清一些关于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的二级缓存作为EHcache。只有实体和关联被设置为可缓存。查询缓存未启用。

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

我的问题是

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

如果我在另一个session中运行相同的HQL,那么客户对象是从二级缓存中获取还是会再次访问数据库。

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

如果我在另一个session中运行相同的HQL,那么相关的地址会从二级缓存中获取还是会再次访问数据库。


是的,HQL使用二级缓存,但仅当您将hibernate.query_cache设置为true并在查询上使用setCacheable(true)时。 - Volodymyr Levytskyi
1个回答

5
因为您还没有启用查询缓存,所以没有实体查询(JPQL或Criteria API)会使用二级缓存。因此,这两个查询都将针对数据库执行。
如果您希望这些查询使用二级缓存,请启用查询缓存。

感谢@VlanMihalcea。对于问题1,我相信Hibernate将运行查询并获取与搜索条件匹配的所有表行的ID。然后它将使用该ID加载对象。根据可用性,可以从级别2或从DB加载对象。这里我只按ID搜索,但仍需要去DB再次获取相同的ID,这不奇怪吗? - Sanush Chacko
1
按ID搜索是一种覆盖默认获取机制的方法,因此您可以明确声明新的获取计划。此外,查询可以在执行之前触发刷新,这就是为什么它不会简单地忽略所有这些以从第1或第2级缓存返回实体的原因。 - Vlad Mihalcea
请查找类似的线程链接 - Sanush Chacko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接