1

我在休眠中有一个对象层次结构。我只是通过遍历层次结构来打印层次结构。

在我到达层次结构的底部之前,一切都很好。我有一个 Group 对象,其中包含 Artifact 对象的集合。我通过休眠映射设置为 Group 对象检索一组工件。我在名为 ratio 的列上执行此操作,而不是 id 列。Group 对象与工件具有一对多的关系。两个对象都有比率字段。

组映射如下所示:

<hibernate-mapping>
    <class name="Group" table="Group">
        <id name="id" type="int">
            <generator class="native" />
        </id>
        <property name="ratio" type="string"></property>
          <set name="artifacts" table="Artifact" 
                inverse="true" lazy="true" fetch="select">
            <key>
                <column name="ratio" not-null="true" />
            </key>
            <one-to-many class="Artifact" />
        </set>
    </class>
</hibernate-mapping>

工件映射:

<hibernate-mapping>
    <class name="Artifact" table="Artifact">
        <id name="id" type="int">
            <generator class="native" />
        </id>
        <property name="ratio" type="string"></property>
    </class>
</hibernate-mapping>

问题是组对象打印出来,但工件在查询中没有返回任何内容。我已经打印了从每组返回的比率。然后,我将 sql 语句复制到了休眠输出中,并在 where 语句条件中替换了比率,一切都正确返回:

 select artifact0_.ratio as rat2_3_1_, artifact0_.id as id1_, artifact0_.id as id4_0_, artifact0_.ratio as rat2_4_0_from Artifact artifact0_ where artifact0_.ratio='1'

有谁知道为什么休眠集合没有返回任何东西?

4

1 回答 1

1

如果您的语句在替换了 ratio 参数的情况下在 sql 中正确执行,但在 Hibernate 执行时却没有执行,那么这是因为您替换了与 Hibernate 实际具有的值不同的值。您可以使用 log4jdbc 之类的工具来查看生成的 SQL 语句中参数的实际值。

映射中的问题是:在集合中,您将键定义为ratio. 这使得ratio表中的外键Artifact并将其与父键连接起来,这是Group.id(而不是Group.ratio您可能想要的)。

有两种解决方案:

  1. 您定义ratio为 中的唯一键Group。然后在您的映射Artifact.ratio中加入Group.ratio.

  2. 如果你不能做1.因为ratio不是唯一的Group(或者你不想做1.),那么和之间的关系GroupArtifact多对多关系,你应该使用<many-to-many>标签。在这里,您拥有属性columnproperty-ref命名两个表中的连接列。

于 2013-01-30T10:00:32.103 回答