0

所以,我真的很想在这里寻找想法。(另请注意:这是一个间歇性问题)

我有一个带有“子”对象集合的“父”对象:

<parent stuff>
...
<set name="children" inverse="true" order-by="child_id">
<cache usage="read-write"/>
<key column="parent_id"/>
<one- to-many class="ChildClass"/>
</set>
...
</parent>

<child stuff>
...
<many-to-one name="parent"
column="parent_id"
insert="true"
更新="true"
非空="true"
类="ParentClass"
index="idx​​_child_parent"/> ...
</child>

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

但是,如果我搜索父对象(并找到它),hibernate 会通过并创建我的 ParentClass,但只填充一个(第一个)孩子的孩子。我实际上调试了休眠代码,发现实际上对 ParentClass 上的 setChildren() 的调用只被发送了一个元素集合——当我知道第一个查询中还有更多元素时。

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

重新启动我的应用程序确实有效。只是因为它在一个看似随机的父母实例上不久就中断了。

没有任何事情(我知道)发生直接导致这种情况。有谁知道会导致此问题的休眠错误或 EHCache 错误。我在缓存上正确调用 clear 吗?

任何指针都会很好。

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

编辑:我还应该补充一点,这个只有 1 个元素的集合处于一种“从不存在”的状态。IE。从来没有只产生 1 个子元素的交易

4

2 回答 2

2

您的 Child 类是否正确实现了 hashcode() 和 equals()?Hibernate 是否有可能看到多个子类附加到同一个父级,因此只保留其中一个?

于 2009-11-23T05:35:56.330 回答
1

事实证明,有一次我们在获得评论时正在执行“join fetch”。join fetch 意味着,对于孩子的集合,只返回与我的 where 子句匹配的孩子。所以说我有 3 个孩子 > 10 和 1 个孩子 < 10,如果我的 where 子句说孩子 < 10,它返回父对象,一组孩子只包含那个孩子。没关系,这就是“join fetch”的用途。

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

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

于 2010-02-10T04:58:37.277 回答