2011-03-04 112 views
3

我有很多-to-many关联等被定义:Hibernate:部分延迟初始化?

Parent.hbm.xml:

<set name="children" table="child_parent_map" lazy="true"> 
     <cache usage="nonstrict-read-write" /> 
     <key column="parent_id" /> 
     <many-to-many class="Child"> 
      <column name="child_id" not-null="true" index="child_parent_by_child"/> 
     </many-to-many> 
    </set> 

Child.hbm.xml:

<set name="parents" table="child_parent_map" lazy="true"> 
     <cache usage="nonstrict-read-write" /> 
     <key column="child_id" /> 
     <many-to-many column="parent_id" class="Parent" lazy="false"/> 
    </set> 

相当肯定我正在初步化Parent.children步行集合。例如:

for(Child child : parent.getChildren()) { 
    Hibernate.initialize(child.getAnotherProperty()); 
} 

父母有六个孩子。然而,在一个会话中,父母似乎只有五个,而在另一个会话中(2秒后,数据库或另一个会话中没有任何变化) - 全部六个。实际上,我在将这些实体从自定义克隆器中分离出来之后发现它。

我认为懒惰的集合要么被完全初始化(即所有的元素都是),要么不是。不知何故,只有部分藏品可以初始化?它可能是缓存问题吗?

编辑:此会话处理一个相当大的数据集(几千个实体)。这是否有可能是因为一些已经加载的实体从会话中被驱逐出来?

+2

你给属性“default_batch_fetch_size”设置了一些值吗? – jpkrohling 2011-03-05 07:57:56

+1

你可以发布父母和孩子的代码吗?我会先看看hashCode()和equals()。 – 2011-03-07 21:13:12

+0

Michal是对的,你可能在hashCode()和/或equals()中引起了你的对象行为异常。 – 2011-03-08 11:06:58

回答

1

开始通过检查你的的hashCode()的equals()方法,不正确地执行这些方法经常会导致这种行为。