5

私は自分のプロジェクトでHibernate 3を使用していくつかのエンティティをマッピングしていますが、次のようなものがあると簡単に説明しました。

  • Studentエンティティ ( tstudentテーブル)
  • UniversityStudentエンティティ ( tuniversitystudentテーブル)
  • Universityエンティティ (チューニバーシティテーブル)

UniversityStudenttuniversitystudentテーブルStudentへの外部キーである、大学自体のような独自の属性から拡張され、それを持っています。また、識別子フィールドを使用して、サブクラスのようにクラスにマップされます。Student

<class name="mycompany.Student" table="tstudent" discriminator-value="BASIC">
    <id name="id" column="id" type="integer">
        <generator class="native" />
    </id>
    <discriminator column="type" />
    <property name="name" column="name" />
    <property name="surname" column="surname" />
    <property name="phoneNumber" column="phone_number" />
    <subclass discriminator-value="UNIVERSITY"
            name="mycompany.UniversityStudent">
        <join table="tuniversitystudent">
            <key column="id_student" />
            <many-to-one name="university" class="mycompany.University">
                <column name="id_university" />
            </many-to-one>
        </join>
    </subclass>
</class>

さて、それぞれのエンティティを含むSetコレクションが必要です。だから私はそれを次のようにマッピングします:UniversityStudentUniversity

<class name="mycompany.University" table="tuniversity">
    <id name="id" column="id" type="integer">
        <generator class="native" />
    </id>
    <property name="name" column="name" />
    <set name="universityStudents" table="tuniversitystudent">
        <key>
            <column name="id_university" />
        </key>
        <one-to-many class="mycompany.UniversityStudent" />
    </set>
</class>

University私の問題は、オブジェクトをロードしたいときに発生します.Hibernateは、 tstudentテーブルid_universityに存在しないと不平を言います。生成された SQL クエリを確認したところ、本当にtstudentからロードしようとしています。

「フィールド リスト」の不明な列「student0_.id_university」

ベーシックのサブクラスだと認識しているようStudentで、親テーブルのフィールドを使ってコレクションに参加しようとしているようですが、大学を割り当てられるのは大学生だけなので、実際にはフィールドは子テーブルにあります。

うまくいくように見える別の回避策を試しましたが、私には有効ではありUniversityStudentませjoined-subclassん。subclass

<joined-subclass name="mycompany.UniversityStudent" table="tuniversitystudent">
    <key column="id_student" />
    <many-to-one name="university" class="mycompany.University">
        <column name="id_university" />
    </many-to-one>
</joined-subclass>

ただし、識別子の値を持つサブクラスとして保持することに興味があります。何か案が?

4

2 に答える 2

2

私はいくつかのリソースをチェックアウトし、最終的にこのバグに陥りました: https://hibernate.atlassian.net/browse/HHH-1015、これはあなたのケースと完全に互換性があるようです。この古い質問も確認してください。これもあなたのケースと非常によく似ています。最初に、Hibernate によって提供されたsublass ごと
のテーブルの定義を読みました(バージョン 3.3 用であることはわかっていますが、Hibernate 4 の同じソースを見つけることができませんでした): (私には) Hibernate によって提供されるのカスタム実装のようですこれは、その使用を避ける正当な理由です。ただし、私が知っていることから、サブクラスごとのマッピングテーブルと、ディスクリミネーター使用したサブクラスごとのテーブルjoined-subclasssubclass using a discriminator同等である必要があります。そのため、私が指摘したバグは実際にはまだ開いていると思います。

時間と意志があれば、別の JPA プロバイダーを使用してみて、同じ問題で引き続き実行されるかどうかを確認してください。JPA 2.0 の仕様は別ですが、プロバイダーの実装は別です。最近、別のバグ ( に関連する) に遭遇したため、 EclipseLink@IdClassを試す必要があり、Hibernate で動作していなかった構成は Eclipse Link で適切でした。

于 2013-08-08T16:02:20.147 に答える