我正在为我的项目使用Hibernate 3映射一些实体,并简单地解释了我的理解:
Student实体(学生表)UniversityStudent实体(tuniversitystudent表)University实体(大学表)UniversityStudentStudent与大学本身一样具有扩展性并具有自己的属性,这是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>
Run Code Online (Sandbox Code Playgroud)
好吧,现在我想要一个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>
Run Code Online (Sandbox Code Playgroud)
当我想加载一个University对象时,我的问题来了,Hibernate抱怨tstudent表id_university中不存在该对象。我检查了生成的SQL查询,它实际上试图从tstudent加载它。
“字段列表”中的未知列“ student0_.id_university”
似乎已经意识到它是basic的子类,Student并尝试使用父表中的字段来加入集合,但是该字段实际上在子表中,因为只有大学生才能分配大学。
我尝试了另一种似乎可行的解决方法,但对我而言无效,那就是将UniversityStudenta 映射为a joined-subclass而不是在内部加入 a subclass的a :
<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>
Run Code Online (Sandbox Code Playgroud)
但是,我有兴趣将其保留为具有区分值的子类。任何的想法?
我检查了一些资源,最终陷入了这个错误: https: //hibernate.atlassian.net/browse/HHH-1015,它看起来与您的情况完全兼容。也检查这个老问题,再次与您的情况非常相似。我首先阅读了 Hibernate 给出的每个子类表
的定义(我知道,它适用于版本 3.3,但我找不到 Hibernate 4 的相同源):(对我来说)似乎是Hibernate 提供的自定义实现,并且这是远离它的使用的一个很好的理由。然而,据我所知,使用鉴别器的每个子类的映射表和每个子类的表应该是等效的,这就是为什么我相信我指出的错误确实仍然存在。
如果您有时间并且愿意,您可以尝试使用其他 JPA 提供程序并检查是否仍然遇到相同的问题。JPA 2.0 规范是一回事,提供程序实现是另一回事!我最近遇到了另一个错误(与 相关),这迫使我尝试EclipseLink,并且不适用于 Hibernate 的配置对于 Eclipse Link 来说是正确的joined-subclasssubclass using a discriminator@IdClass