gpt4 book ai didi

java - 使用子类连接表中的外键映射 hibernate 多对一

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:02 27 4
gpt4 key购买 nike

我正在为我的项目使用 Hibernate 3 映射一些实体,并简单地解释说我有这样的东西:

  • Student 实体(tstudent 表)
  • UniversityStudent 实体(tuniversitystudent 表)
  • University 实体(tuniversity 表)

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 集合,其中包含每个 UniversityUniversityStudent 实体。所以我这样映射它:

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

Unknown column 'student0_.id_university' in 'field list'

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

我尝试了另一种似乎有效但对我无效的解决方法,它将 UniversityStudent 映射为 joined-subclass 而不是 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>

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

最佳答案

我检查了一些资源并最终遇到了这个错误:https://hibernate.atlassian.net/browse/HHH-1015 ,看起来与您的情况完全兼容。结帐this old question as well ,再次与您的情况非常相似。
我首先阅读了 table per sublass 的定义由 Hibernate 给出(我知道,它适用于版本 3.3,但我找不到适用于 Hibernate 4 的相同来源):joined-subclass 似乎(对我而言)是 的自定义实现子类使用 Hibernate 提供的鉴别器,这是远离它的使用的一个很好的理由。但是,据我所知,映射 table per sublasstable per subclass using a discriminator应该是等效的,这就是为什么我相信我向您指出的错误仍然存​​在。

如果您有时间并且愿意,您可以尝试使用另一个 JPA 提供程序并检查您是否仍然遇到相同的问题。 JPA 2.0 specifications是一回事,提供者实现是另一回事!我最近遇到了另一个错误(与 @IdClass 相关),这迫使我尝试 EclipseLink并且不适用于 Hibernate 的配置适用于 Eclipse Link

关于java - 使用子类连接表中的外键映射 hibernate 多对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com