我在休眠中有一个对象层次结构。我只是通过循环遍历层次结构来打印层次结构。
一切都打印出来,直到我到达层次结构的底部。我有一个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集合没有返回任何内容?
答案 0 :(得分:1)
如果你的语句在sql中正确执行并且比例参数被替换但是在Hibernate执行时不能执行,那么这是因为你已经替换了与Hibernate实际拥有的不同的值。您可以使用log4jdbc之类的工具来查看生成的SQL语句中参数的实际值。
映射中的问题是:在集合中,您将密钥定义为ratio
。这会使ratio
表中的外键Artifact
并将其与父项的键连接,Group.id
(而不是Group.ratio
,因为您可能意)。
有两种解决方案:
您将ratio
定义为Group
中的唯一键。然后,在您的映射中Artifact.ratio
加入Group.ratio
。
如果你做不了1.因为ratio
在Group
中不是唯一的(或者如果你不想做1),那么Group
之间的关系1}}和Artifact
是多对多的关系,您应该使用<many-to-many>
标记。您可以在此处使用column
和property-ref
属性来命名两个表中的连接列。