我正在为我的项目使用Hibernate 3映射一些实体,并简单地解释说我有这样的:
Student
实体(tstudent表)UniversityStudent
实体(tuniversitystudent表)University
实体(大学表)
UniversityStudent
扩展自Student
并有自己的属性,就像大学本身一样,它是进入tuniversitystudent表的外键。它也像子类一样映射到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
as ajoined-subclass
而不是 a内部subclass
有一个join:
<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>
但是,我有兴趣将其保留为具有鉴别器值的子类。任何想法?