Java 基本的Hibernate设置问题:为什么这会导致一百万个空对象?

Java 基本的Hibernate设置问题:为什么这会导致一百万个空对象?,java,hibernate,Java,Hibernate,我有两个表:foo(主键:foo_id)和foo_entry(主键:foo_entry_id;外键:foo_id) 下面是我的Hibernate配置。 我的问题是,当我在FooModel类上调用getAttributes()时,我最终得到了一个超过一百万个空对象的列表。(foo表约有200行,foo_条目约有10000行) 我刚开始冬眠,我怀疑我只是忽略了或者只是不理解一些非常非常基本的东西。感谢您的帮助 <hibernate-mapping package="com.blah.www"&

我有两个表:foo(主键:foo_id)和foo_entry(主键:foo_entry_id;外键:foo_id)

下面是我的Hibernate配置。
我的问题是,当我在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>

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


旁白——我使用Hibernate一年了,从未编写过属性注入模型或类似于您的节目的文件。我们总是对数据库进行反向工程。

这些数字意味着您将获得笛卡尔连接。您是否在数据库中设置了FK


旁白——我使用Hibernate一年了,从未编写过属性注入模型或类似于您的节目的文件。我们总是对数据库进行反向工程。

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



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


叹气

事实证明,这有一个非常合乎逻辑(而且非常微妙)的解释。 我误解并劫持了内部(也称为)标记的语义。即,鉴于:

<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将创建一个列表,并将该对象插入100001st位置。它前面的每个列表成员自然都是空的。

事实证明,这有一个非常合乎逻辑(而且非常微妙)的解释。 我误解并劫持了内部(也称为)标记的语义。即,鉴于:

<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将创建一个列表,并将该对象插入100001st位置。它前面的每个列表成员自然都是空的。

如果您提供数据库架构的快照,将非常有帮助。如果您提供数据库架构的快照,将非常有帮助。是的,我没有在数据库中设置FK。这样做解决了我的问题,谢谢@Aaron F:顺便说一句,在数据库中设置外键不是强制性的。我们有时在开发和测试模式中不这样做。除非你是逆向工程。设置FK只会对有效数据实施约束-不会影响查询将返回的内容-这绝对不是我看到的;添加FK使相同的代码突然执行。奇怪的是,我会仔细检查——添加FK并没有消除“100万个空对象列表”的问题。但它确实消除了OOM的问题。是的,我没有在数据库中设置FK。这样做解决了我的问题,谢谢@Aaron F:顺便说一句,在数据库中设置外键不是强制性的。我们有时在开发和测试模式中不这样做。除非你是逆向工程。设置FK只会对有效数据实施约束-不会影响查询将返回的内容-这绝对不是我看到的;添加FK使相同的代码突然执行。奇怪的是,我会仔细检查——添加FK并没有消除“100万个空对象列表”的问题。但它确实消除了OOM问题。是的!不允许删除“”条目。但是从标记中删除“table=“foo_entry”属性确实消除了“100万个空对象列表”问题。奇怪的是,对于标记,“table”属性记录为:“(可选-默认为property name):集合表的名称。它不用于一对多关联。”。。。如果它不用于一对多关联,那么Hibernate可能会在包含标记时抛出编译时错误@亚伦:真的没法把你带到这里来。在
内有
标签是合法的。文档仅说明
元素的
属性不用于
一对多
关联。因为,我们需要一个
来定义关系,所以表名不能定义关系。我想出来了,请参阅我发布的答案。是的!不允许删除“”条目。但是从标记中删除“table=“foo_entry”属性确实消除了“100万个空对象列表”问题。奇怪的是,对于标记,“table”属性被记录为:“(可选-默认为property name):集合的名称