1

私はこのシナリオを持っています:親クラスPerson、子クラス:個人と企業。私はこのクラスを次のような結合サブクラス戦略でマッピングしています:

<hibernate-mapping>
  <class catalog="test" name="test.Person" table="Persons">
    <id name="id" type="int">
      <column name="IdPerson"/>
      <generator class="increment"/>
    </id>

    <set inverse="true" name="addresses">
      <key>
        <column name="IdPerson" not-null="true"/>
      </key>
      <one-to-many class="test.Address"/>
    </set>

    <set inverse="true" name="phones">
      <key>
        <column name="IdPerson" not-null="true"/>
      </key>
      <one-to-many class="test.Phone"/>
    </set>

    <joined-subclass name="test.Individual" table="Individuals">
      <key column="IdPerson"/>

      <property name="nameIndividual" type="string">
        <column length="30" name="Name" not-null="true"/>
      </property>
    ...
    </joined-subclass>

    <joined-subclass name="test.Enterprise" table="Enterprises">
      <key column="IdPerson"/>

      <property name="nameEnterprise" type="string">
        <column length="30" name="Name" not-null="true"/>
      </property>
    ...
    </joined-subclass>

  </class>

  <class catalog="test" name="test.Address" table="Addresses">

    <composite-id class="test.AddressId" name="id">
      <key-many-to-one name="person" class="test.Person">
        <column name="IdPerson" not-null="true"/>
      </key-many-to-one>
      <key-property name="id" type="int">
        <column name="IdAddress"/>
      </key-property>
    </composite-id>

    <many-to-one name="person" class="test.Person" fetch="select" insert="false" update="false">
      <column name="IdPerson" not-null="true"/>
    </many-to-one>
    ...    
  </class>

  <class catalog="test" name="test.Phone" table="Phones">

    <composite-id class="test.PhoneId" name="id">
      <key-many-to-one name="person" class="test.Person">
        <column name="IdPerson" not-null="true"/>
      </key-many-to-one>
      <key-property name="id" type="int">
        <column name="IdPhone"/>
      </key-property>
    </composite-id>

    <many-to-one name="person" class="test.Person" fetch="select" insert="false" update="false">
      <column name="IdPerson" not-null="true"/>
    </many-to-one>
    ...
  </class>

</hibernate-mapping>

この単純なHQLを使用して個人のリストをロードすると、次のようになります。

List result = session.createQuery("from Person as en").list();

hibernateはポリモーフィズムを解決し、IndividualsオブジェクトとEnterprisesオブジェクトのリストを取得します。

しかし、私が住所と電話を含めると:

List result = session.createQuery("from Person as en left join fetch en.addresses left join fetch en.phones").list();

hibernateは、IndivualクラスとEnterpriseクラスの特定のプロパティにアクセスできないPerson _ $$_javassist_5オブジェクトのリストを返します。

これは予想される動作ですか?どうすればこれを解決できますか?

前もって感謝します。

編集:

AddressクラスとPhoneクラスのマッピングを含めましたが、そのIDは複合であり、Hibernateによって生成されたjavassistプロキシの理由のようですが、プロキシがポリモーフィズムを正しく解決しないのはなぜですか?hibernateがデータベースからすべてのデータを取得する場合でも。

私のJSFページはjavax.el.PropertyNotFoundExceptionエラーをスローします:クラス'test.Person _ $$_javassist_5'にはプロパティ'nameIndividual'がありません。

4

1 に答える 1

0

同様の例を試しました。つまり、1つのクラスに2つの結合されたサブクラスがあり、親クラスには1対多の関連付けがあります。

あなたの例のように、私はフェッチを使用せずに親クラスのレコードを取得してから、「左結合フェッチ」を取得しました。

どちらの場合も、1対多の関連付けを正しく取得しました。

フェッチモードを使用すると、結果のリストに重複するレコードが含まれていました。

たとえば、1対多の関連付けでは、1つのレコードの関連テーブルに4つのレコードがあり、結果のリストには同じオブジェクトが4回含まれています。他のレコードの場合、関連するレコードに2つのレコードがある場合、結果のリストには同じオブジェクトが2回含まれます。

ただし、これはHibernateのドキュメントに従って予想されます:-http: //docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

「fetch構文は、iterate()を使用して呼び出されるクエリでは使用できません(scroll()は使用できます)。フェッチは、setMaxResults()またはsetFirstResult()と一緒に使用する必要があります。これらの操作は、通常、次の結果行に基づいているためです。熱心なコレクションフェッチの場合は重複するため、行数は期待どおりではありません。フェッチは、条件付きの即席と一緒に使用しないでください。クエリで複数のコレクションを結合フェッチすることにより、デカルト積を作成できます。この場合は注意が必要です。複数のコレクションロールをフェッチする結合は、バッグマッピングに対して予期しない結果をもたらす可能性があるため、この場合のクエリを作成するときは、ユーザーの裁量で判断することをお勧めします。最後に、完全結合フェッチと右結合フェッチは意味がないことに注意してください。」

于 2012-11-17T06:36:37.733 に答える