3

このモデル スキーマを持つ:

Person
    |__ Student
            |__ SchoolBoy
            |__ CollegeStudent

私は Hibernate 3.6 を使用しており、識別子列を使用して、すべてのクラスにtpersonテーブルを使用しています。私のマッピングは次のように行われます:

<class name="Person" table="tperson" discriminator-value="PERSON">
    <id name="Id" column="id" type="integer">
        <generator class="increment" />
    </id>
    <discriminator column="person_type" />
    <subclass name="Student" discriminator-value="STUDENT">
        <key column="id_person" />
        <subclass name="SchoolBoy" discriminator-value="SCHOOL_BOY">
            <join table="tstudent">
                <key column="id_person" />
            </join>
        </subclass>
        <subclass name="CollegeStudent" discriminator-value="COLLEGE_STUDENT">
            <join table="tstudent">
                <key column="id_person" />
            </join>
        </subclass>
    </subclass>
</class>

ここで、コースと学生の間の関係を実装するCourseエンティティを紹介したいと思います。もちろん、これは多対多の関係です。SchoolBoyCollegeStudentの両方のタイプの学生を含む tstudent_course という名前のピボット テーブルを使用するとします。このテーブルには、その人自身と彼が勉強しているコースへの参照が含まれています。

ここで、 Courseエンティティを読み込むときに大学生と学校の学生を区別したいと考えています。私はそのようにします:

<set name="CollegeStudents" table="tstudent_course"
            inverse="true">
    <key>
        <column name="id_course" not-null="true" />
    </key>
    <many-to-many entity-name="CollegeStudent">
        <column name="id_person" not-null="true" />
    </many-to-many>
</set>

<set name="SchoolStudents" table="tstudent_course"
            inverse="true">
    <key>
        <column name="id_course" not-null="true" />
    </key>
    <many-to-many entity-name="SchoolBoy">
        <column name="id_person" not-null="true" />
    </many-to-many>
</set>

ただし、ピボット テーブルはすべてのタイプの学生への参照を含むテーブルであるため、コレクション内のすべての学生をロードしようとすると、次の例外が発生します。

Object with id: 2 was not of the specified subclass: 
   CollegeStudent (loaded object was of wrong class class SchoolBoy)

Hibernate は、私が持っている具体的なタイプの学生を評価せずに結合を行っているようで、大学生のコレクションに SchoolBoy を挿入しようとしています。

それを避けるにはどうすればよいですか?ピボットテーブルで一種の差別化を図ることは可能ですか? それとも、サブクラスの種類ごとに特定のピボット テーブルを作成する必要がありますか?

4

1 に答える 1

2

セットにフィルターを追加できます。

<set name="CollegeStudents" table="tstudent_course"
            inverse="true">
    <key>
        <column name="id_course" not-null="true" />
    </key>
    <many-to-many entity-name="CollegeStudent" where="person_type='COLLEGE_STUDENT'">
        <column name="id_person" not-null="true" />
    </many-to-many>
</set>

IMHOマッピングは、そのフィルターがなければより良いでしょう(すべての学生のセットだけです)。

于 2013-07-09T08:34:43.383 に答える