使用子类联接表中的外键将休眠多对一映射

Xtr*_*ica 5 java hibernate

我正在为我的项目使用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抱怨tstudentid_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)

但是,我有兴趣将其保留为具有区分值的子类。任何的想法?

Tha*_*ish 2

我检查了一些资源,最终陷入了这个错误: 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