hibernate ehcache只找到一个集合的1个元素

时间:2009-11-23 04:38:07

标签: java hibernate ehcache

所以,我真的抓住了吸管的想法。 (另请注意:这是间歇性问题)

我有一个'父'对象,其中包含'子'对象的集合:

<父母的东西>
...
        < set name =“children”inverse =“true”order-by =“child_id”>
            < cache usage =“read-write”/>
            < key column =“parent_id”/>
            < one-to-many class =“ChildClass”/>
        < /集>
...
< /亲本GT;

<儿童用品>
...
        <多对一名称=“父母”
                     柱= “PARENT_ID”
                     插入=“真”
                     更新=“真”
                     不空=“真”
                     类=“父类”
                     索引= “idx_child_parent”/> ...
< /儿童>

如果我运行的查询类似于: “从ChildClass孩子中选择孩子”+                 “where child.parent =:parent”; 它找到了所有的孩子。完美。

然而,如果我搜索父对象(并找到它),hibernate将通过并创建我的ParentClass,但只填充子节点的ONE(第一个)子节点。我实际上调试了hibernate代码,发现实际上在ParentClass上调用setChildren()只发送了1个元素集合 - 当我知道第一个查询中有更多内容时。

所以,我正在使用EHCache,清除它没有用:调用CacheManager.getInstance()。clearAll();

重启我的应用程序是否有效。只是因为它在一个看似随机的父母实例后不久就会破裂。

没有任何东西(我知道)正在发生直接导致这种情况。有没有人知道会导致这个或者EHCache错误的hibernate错误。我在缓存上正确地打电话了吗?

任何指针都会很好。

我使用的是hibernate 3.2.6,同样的问题发生在mysql和postgres上。

编辑:我还应该补充说,只有1个元素的这个集合处于某种“从未存在”的状态。即。从来没有一个交易导致只有一个子元素

2 个答案:

答案 0 :(得分:2)

您的孩子班implement hashcode() and equals() correctly?是否有可能Hibernate看到多个附加到同一个Parent的Child类作为等价的,因此只保留其中一个?

答案 1 :(得分:1)

事实证明,在获得评论时,我们正在进行“加入获取”。连接提取意味着,对于子集合,仅返回与我的where子句匹配的子节点。所以说我有3个孩子> 10岁和1岁的孩子< 10,如果我的where子句说孩子< 10,它返回父对象,其中一组子节点只包含一个子节点。多数民众赞成,这就是“加入获取”的目的。

错误的是Ehcache不知道这个父对象是“不完整的”,因此它将这个不完整的值存储在缓存中。下次我想要“完整”的父对象,我没有得到它,我得到了不完整的一个,而Hibernate不会告诉我(不知道)否则。

编辑:注意,这只是偶然的,每次发生时,它只有1个子元素。它可能会有更多。