【发布时间】:2013-07-31 11:28:24
【问题描述】:
我正在为我的项目使用 Hibernate 3 映射一些实体,并简单地解释说我有这样的:
-
Student实体(学生表) -
UniversityStudent实体(tuniversitystudent 表) -
University实体(大学表)
UniversityStudent 扩展自 Student 并具有自己的属性,例如大学本身,它是 tuniversitystudent 表的外键。它也像子类一样映射到 Student 类,使用 discriminator 字段:
<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 集合,其中每个 University 都有 UniversityStudent 实体。所以我这样映射它:
<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,而不是内部带有join 的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>
但是,我有兴趣将其保留为具有鉴别器值的子类。有什么想法吗?
【问题讨论】:
-
你为什么一直使用 hbm.xml 文件?他们太乱了
-
由于时间原因,并非每个遗留项目都可以移植到 JPA 注释。而且我在这里没有看到任何混乱。
-
可能是个愚蠢的问题 - DB 中大学生记录的类型列是否具有“UNIVERSITY”?