所以,我真的抓住了吸管的想法。 (另请注意:这是间歇性问题)
我有一个'父'对象,其中包含'子'对象的集合:
<父母的东西>
...
< 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个元素的这个集合处于某种“从未存在”的状态。即。从来没有一个交易导致只有一个子元素
答案 0 :(得分:2)
您的孩子班implement hashcode() and equals() correctly?是否有可能Hibernate看到多个附加到同一个Parent的Child类作为等价的,因此只保留其中一个?
答案 1 :(得分:1)
事实证明,在获得评论时,我们正在进行“加入获取”。连接提取意味着,对于子集合,仅返回与我的where子句匹配的子节点。所以说我有3个孩子> 10岁和1岁的孩子< 10,如果我的where子句说孩子< 10,它返回父对象,其中一组子节点只包含一个子节点。多数民众赞成,这就是“加入获取”的目的。
错误的是Ehcache不知道这个父对象是“不完整的”,因此它将这个不完整的值存储在缓存中。下次我想要“完整”的父对象,我没有得到它,我得到了不完整的一个,而Hibernate不会告诉我(不知道)否则。
编辑:注意,这只是偶然的,每次发生时,它只有1个子元素。它可能会有更多。