5

我正在为我的项目使用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集合。所以我像这样映射它:UniversityStudentUniversity

<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 抱怨说tstudentid_university中不存在。我检查了生成的 SQL 查询,它确实尝试从tstudent加载它。

“字段列表”中的未知列“student0_.id_university”

似乎它认识到它是基本的子类Student并尝试使用父表中的字段加入集合,但该字段实际上在子表中,因为只有大学生才能分配大学。

我尝试了另一种似乎可行但对我无效的解决方法,即映射UniversityStudentas 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>

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

4

2 回答 2

2

我查看了一些资源,最后发现了这个错误:https ://hibernate.atlassian.net/browse/HHH-1015 ,它看起来与您的情况完全兼容。也检查这个老问题,再次与您的情况非常相似。
我首先阅读了 Hibernate 给出的table per sublass的定义(我知道,它适用于 3.3 版,但我找不到 Hibernate 4 的相同来源):joined-subclass似乎(对我来说)是subclass using a discriminator由 Hibernate 提供的自定义实现和这是远离它的使用的一个很好的理由。但是,据我所知,每个子类的映射每个子类的表使用鉴别器应该是等价的,这就是为什么我相信我指出你的错误仍然是开放的。

如果您有时间并且愿意,您可以尝试使用另一个 JPA 提供程序并检查您是否仍然遇到相同的问题。JPA 2.0 规范是一回事,提供者实现是另一回事!我最近遇到了另一个@IdClassbug

于 2013-08-08T16:02:20.147 回答
1

似乎您可以使用自定义 SQL(或 HQL)进行加载。自己没有尝试过,但看起来,嗯,至少作为最后的手段,它提供了一个不错的解决方案。

在您的 HBM 中定义查询:

<sql-query name="universityStudents">
    <load-collection alias="unistu" role="University.universityStudents"/>
    SELECT unistu.*, student.*
    FROM tuniversitystudent unistu 
    JOIN tstudent student 
    ON unistu.id_student = student.id
    WHERE unistu.id_university = :id
</sql-query>

然后在里面使用它University

<set name="universityStudents" inverse="true">
    <key/>
    <one-to-many class="mycompany.UniversityStudent"/>
    <loader query-ref="universityStudents"/>
</set>
于 2013-08-03T23:47:10.810 回答