私は自分のプロジェクトでHibernate 3を使用していくつかのエンティティをマッピングしていますが、次のようなものがあると簡単に説明しました。
Student
エンティティ ( tstudentテーブル)UniversityStudent
エンティティ ( tuniversitystudentテーブル)University
エンティティ (チューニバーシティテーブル)
UniversityStudent
tuniversitystudentテーブル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
コレクションが必要です。だから私はそれを次のようにマッピングします:UniversityStudent
University
<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>
ただし、識別子の値を持つサブクラスとして保持することに興味があります。何か案が?