代码之家  ›  专栏  ›  技术社区  ›  Aaron Fi

基本的休眠设置问题:为什么会产生一百万个空对象?

  •  0
  • Aaron Fi  · 技术社区  · 14 年前

    我有两个表:foo(主键:foo-id)和foo-entry(主键:foo-entry-id;外键:foo-id)。

    下面是我的休眠配置。
    我的问题是,当我在foomodel类上调用getattributes()时,最终得到了一个超过一百万个空对象的列表。(foo表有~200行,foo_项有~10000行)。

    我刚开始冬眠,怀疑我只是在忽视或不了解一些非常、非常基本的东西。感谢您的帮助!

    <hibernate-mapping package="com.blah.www">
      <class name="FooModel" table="foo">
        <id name="fooId" column="foo_id"></id>
    
        <list name="attributes" table="foo_entry">
          <key column="foo_id" />
          <index column="entry_id" />
          <one-to-many class="FooEntryModel" />
        </list>
      </class>
    </hibernate-mapping>
    
    <hibernate-mapping package="com.blah.www">
      <class name="FooEntryModel" table="foo_entry">
        <id name="fooEntryId" column="foo_entry_id">
          <generator class="native" />
        </id>
    
        <property name="fooId"      type="int"       column="foo_id"      /> 
        <property name="attrName"   type="string"    column="attr_name"   />
        <property name="attrValue"  type="string"    column="attr_value"  />
        <property name="startDate"  type="timestamp" column="start_date"  /> 
        <property name="endDate"    type="timestamp" column="end_date"    />
      </class> 
    </hibernate-mapping>
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Tony Ennis    14 年前

    这些数字意味着你得到了笛卡尔连接。您在数据库中设置了FK吗?

    除此之外-我使用了Hibernate一年,从未对属性注入模型或类似于您的节目的文件进行编码。我们总是对数据库进行反向工程。

        2
  •  2
  •   Adeel Ansari    14 年前

    调试的第一步是在日志中查看为您生成的Hibernate查询。不过,我建议你试试这个,

    <list name="attributes">
      <key column="foo_id" />
      <one-to-many class="FooEntryModel" />
    </list>
    

        3
  •  0
  •   Aaron Fi    14 年前

    叹息…

    事实证明,这是一个非常合乎逻辑(而且非常微妙)的解释。 我误解并劫持了<list>中<index>(也称为<list index>)标记的语义。也就是说:

    <list name="attributes">
        <key column="foo_id" />
        <index column="some_integer_value" />
        <one-to-many class="FooEntryModel" />
    </list>
    

    …我想是指你想要排序的属性。实际上,它指的是一个属性,其值表示在列表中插入整个对象的索引位置。它是一个占位符属性,由Hibernate完全维护和使用。

    我要映射到的“某个整数值”的值在测试数据中有所不同。有时值小于100。有时它会超过一百万。

    因此,在只映射一行“some_integer_value”==100001时,Hibernate将创建一个列表,该对象插入100001位置。它前面的每个列表成员自然都是空的。