【发布时间】:2014-08-12 02:11:35
【问题描述】:
我想澄清一些关于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) 的外键引用,以支持一对多关系。
作为先决条件,我已将休眠的二级缓存启用为 EHcache。只有实体和关联设置为可缓存。查询缓存未启用。
我知道,如果我多次使用 session.get() 或 session.load(),只有第一次调用会触发对数据库的查询,后续调用将从 2 级缓存中获取数据。
我的问题是
1) HQL 是否会利用二级缓存。 在一个会话中,我执行了一个 HQL 以使用主键 (id) 获取对象,“来自 Customer c where c.id = ?”).setParameter(1, 1005)。
如果我在不同的会话中运行相同的 HQL,客户对象是从 2 级缓存中获取还是会再次访问数据库。
2) 考虑执行另一个 HQL from Customer as c left join fetch c.addressList 以选择客户和关联地址。
如果我在不同的会话中运行相同的 HQL,是否会从二级缓存中获取关联的地址,否则它将再次访问数据库。
【问题讨论】:
-
是的,HQL 使用二级缓存,但前提是您将
hibernate.query_cache设置为 true 并在查询中使用setCacheable(true)。
标签: java hibernate jpa hql second-level-cache