我有一对多关系:父记录与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这个问题太多了吗?