【发布时间】:2014-06-20 16:08:06
【问题描述】:
据我了解,使用主键加载对象时将使用二级缓存。这包括关联的获取。我只能想到上面的 session.get(),session.load 方法,二级缓存将进入图片。
如果关联是集合或其他实体,它如何被缓存?例如:-
@Cacheable
public class Department{
private List Employees;
private DepatmentDetail detail ;
}
如何使关联员工和详细信息可缓存?我想我需要在关联员工和详细信息上方提及@cache。 但这不起作用?
当开发人员执行 department.getEmployees() 时,hibernate 将在内部触发查询,即
select * from employees where deptId =1;
现在,如果我使用查询缓存,我明确地进行上述查询并获取结果,查询将再次被触发到 db。为什么查询再次被触发。我认为这与hibernate如何在内部存储二级缓存和查询缓存的结果有关(它们可能存储在不同的区域中)。如果有人也能对这方面有所了解,那就太好了。
【问题讨论】:
-
你在这里似乎很困惑。这些项目都是二级缓存的一部分。如果打开二级缓存,一切(几乎)都会通过它。所有会话都使用 same 二级缓存 - 这就是为什么它是二级缓存。每个会话也有它自己的缓存(如果你愿意的话,第一级缓存)。
-
但是 b/w 二级和查询缓存的差异是什么?
-
在您的示例中,您必须将
@Cache注释放在员工实体本身上,因为集合缓存只包含员工主键 (id) 而不是实际的员工实例。这意味着如果员工本身也没有缓存,Hibernate 将不得不去 DB 加载它们。
标签: java hibernate second-level-cache