Hibernate通过列表中的主键查找直接到L2缓存

时间:2011-10-14 19:03:24

标签: hibernate jpa primary-key cpu-cache

我有一个带有简单长主键的实体。 我做一个查询:从表中选择primary_key IN(....);

Hibernate似乎想要进行查询来获取Ids(我刚才指定的!)然后转到L2缓存。有没有办法跳过初始查询?我只想通过主键实现一组实体。 不确定这是JPA 1还是JPA 2.0(更好地支持Lists)。

我可以在循环中找到findById()并获得所需的结果,但这显然不是最佳的。

1 个答案:

答案 0 :(得分:0)

您需要启用query caching和此特定查询作为缓存能力。这仅适用于JPA 2.0中的提示。

query.setHint(“org.hibernate.cacheable”, true);

通过设置以下属性

启用查询缓存
hibernate.cache.use_query_cache true

另一种解决方案是在循环中使用getReference并启用批量加载。如果实例存在于缓存中,它将从缓存中返回 - 如果不是在访问第一个代理对象时,它将触发一个查询以加载一批这些。您可以将其隐藏在实用程序功能之后。

public List<T> findMany(Class<T> entityClass,List<? extends Serializable> ids) {
  List<T> result = new ArrayList<T>;
  for(Serializable id:ids) {
     result.add(entityManager.getRefrence(id));
  }

  for(T entity:result) {
    // force initialization of proxies, if batch loading is enabled
    // this shouldn't lead to one query per entity
    Hibernate.initialize(entity); 
  }
  return result;      
} 

这可能需要一些调整 - 没有测试过 - 特别是泛型部分。