小编bse*_*ans的帖子

避免n + 1选择与缓存Hibernate关联或缓存集合作为一个整体

我有一对多关系:父记录与n子记录.这些记录经常使用和只读,是缓存的理想选择.

这是我的Hibernate映射的近似值:

`<class name="Parent" table="Parent>
   <cache usage="read-only"/>
   <id name="primary_key"/>
   <property name="natural_key"/>

   <set name="children" lazy="false" fetch="join">
      <cache usage="read-only"/>
      <key-column name="parent_id"/>
      <one-to-many class="Child"/>
   </set>
</class>

<class name="Child" table="Child">
   <cache usage="read-only"/>
   <id name="primary_key"/>
   <property name="parent_id"/>
</class>`
Run Code Online (Sandbox Code Playgroud)

我经常一个自然键,而不是主键获取父,所以我需要启用查询缓存,以便采取的二级高速缓存(我用的Ehcache)的优势.

这是问题所在:当我获取父级并在查询缓存中获得命中时,它将成为"按主键提取"查询.对于我的一对多的"一"结尾来说这很好.如果在缓存中找不到Parent,则从DB中获取它.如果在缓存中找不到我的n个子记录,Hibernate会使用n个后续选择查询来获取它们.N + 1选择问题.

我想要的是一种缓存由parent_id键入的Child对象集合的方法.我希望Hibernate在整个缓存中查找我的集合,而不是作为一堆单独的记录.如果找不到集合,我希望Hibernate使用1 select语句获取集合 - 使用parent_id = x获取所有Child.

从Hibernate + ehcache这个问题太多了吗?

collections caching hibernate

4
推荐指数
1
解决办法
1909
查看次数

标签 统计

caching ×1

collections ×1

hibernate ×1