hibernate不填充集合但查询匹配

时间:2013-01-29 23:38:39

标签: sql hibernate hibernate-mapping

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

一切都打印出来,直到我到达层次结构的底部。我有一个Group对象,它有一个Artifact对象的集合。我通过hibernate映射设置为Group对象检索一组工件。我在名为ratio的列上执行了此操作,而不是id列。 Group对象与工件有1对多的关系。两个对象都有比率字段。

组映射如下所示:

<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语句复制出来放入hibernate输出并用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'

有谁知道为什么hibernate集合没有返回任何内容?

1 个答案:

答案 0 :(得分:1)

如果你的语句在sql中正确执行并且比例参数被替换但是在Hibernate执行时不能执行,那么这是因为你已经替换了与Hibernate实际拥有的不同的值。您可以使用log4jdbc之类的工具来查看生成的SQL语句中参数的实际值。

映射中的问题是:在集合中,您将密钥定义为ratio。这会使ratio表中的外键Artifact并将其与父项的键连接,Group.id(而不是Group.ratio,因为您可能意)。

有两种解决方案:

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

  2. 如果你做不了1.因为ratioGroup中不是唯一的(或者如果你不想做1),那么Group之间的关系1}}和Artifact是多对多的关系,您应该使用<many-to-many>标记。您可以在此处使用columnproperty-ref属性来命名两个表中的连接列。