1

休止状態のオブジェクトの階層があります。階層をループして階層を出力しているだけです。

階層の一番下に到達するまで、すべてがうまく出力されます。Artifact オブジェクトのコレクションを持つ Group オブジェクトがあります。グループ オブジェクトのアーティファクトのセットを取得するために、休止状態のマッピングによって設定します。id 列ではなく、 ratio という列でこれを行いました。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 ステートメントをコピーして休止状態の出力を出力し、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

次の 2 つの解決策があります。

  1. ratioで一意のキーとして定義しますGroup。次に、マッピングArtifact.ratioで に結合されGroup.ratioます。

  2. ratio1.が一意ではないために 1. を実行できない場合Group(または 1. を実行したくない場合)、 と の間の関係GroupArtifact多対多の関係であり、<many-to-many>タグを使用する必要があります。ここには、両方のテーブルの結合列に名前を付けるためのプロパティがcolumnあります。property-ref

于 2013-01-30T10:00:32.103 に答える