Hibernate L2缓存和多对多关系

时间:2009-05-13 15:38:52

标签: java hibernate orm

我有一对Hibernate实体,A和B,它们通过双向多对多关系相关,如here所述 - 即,每个实体都有一个包引用一个集合的其他类型的实体,链接表包含每个实体的主键。

我也在使用Hibernate L2缓存来缓存集合值,如下所示:

<bag name="xyz" table="XYZ" ...>
    <cache usage="nonstrict-read-write"/>
</bag>

我发现的问题是,当我从一侧更新关系时,另一侧的缓存项目集合不会更新。

例如:

A a = session.get(1L, A.class);

B b = a.getBs().get(0);
Long bId = b.getId();

a.getBs().remove(0) // delete the B from A
// ... flush and commit the transaction...

B b2 = session.get(bId, B.class);
Collection<A> as = b2.getAs();

Collection as仍然包含对a的引用,即使数据库状态反映了关系已被删除的事实。在使缓存失效后,Hibernate将返回正确的结果。

hibernate是否有任何机制来处理相关实体的缓存失效,或者我是否需要从两端删除关系?

我正在使用Hibernate 3.2.6。

1 个答案:

答案 0 :(得分:1)

根据定义,您需要从两侧移除。这很有意义 技术角度基本上两个集合都被缓存 独立地

当然,从实际角度来看,这是无稽之谈 很多人会绊倒它。