gpt4 book ai didi

java - 使用相同的数据透视表与子类 hibernate 多对多

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:47 28 4
gpt4 key购买 nike

具有此模型架构:

Person
|__ Student
|__ SchoolBoy
|__ CollegeStudent

我使用的是 Hibernate 3.6,我对所有类使用 tperson 表,使用鉴别器列。我的映射是这样完成的:

<class name="Person" table="tperson" discriminator-value="PERSON">
<id name="Id" column="id" type="integer">
<generator class="increment" />
</id>
<discriminator column="person_type" />
<subclass name="Student" discriminator-value="STUDENT">
<key column="id_person" />
<subclass name="SchoolBoy" discriminator-value="SCHOOL_BOY">
<join table="tstudent">
<key column="id_person" />
</join>
</subclass>
<subclass name="CollegeStudent" discriminator-value="COLLEGE_STUDENT">
<join table="tstudent">
<key column="id_person" />
</join>
</subclass>
</subclass>
</class>

现在我想介绍类(class)实体,实现类(class)和学生之间的关系。当然,这是多对多的关系。假设我使用名为 tstudent_course 的数据透视表,其中包含 SchoolBoyCollegeStudent 两种类型的学生。此表包含对该人本身和他正在学习的类(class)的引用。

现在我想在加载 Course 实体时区分大学生和学校学生。我是这样做的:

<set name="CollegeStudents" table="tstudent_course"
inverse="true">
<key>
<column name="id_course" not-null="true" />
</key>
<many-to-many entity-name="CollegeStudent">
<column name="id_person" not-null="true" />
</many-to-many>
</set>

<set name="SchoolStudents" table="tstudent_course"
inverse="true">
<key>
<column name="id_course" not-null="true" />
</key>
<many-to-many entity-name="SchoolBoy">
<column name="id_person" not-null="true" />
</many-to-many>
</set>

但是,作为一个包含对每种类型学生的引用的数据透视表,它会尝试加载我 Collection 中的每个学生,我会收到下一个异常:

Object with id: 2 was not of the specified subclass: 
CollegeStudent (loaded object was of wrong class class SchoolBoy)

Hibernate 似乎正在执行连接,但没有评估我拥有的具体学生类型,并试图在我的 College Students 集合中注入(inject)一个 SchoolBoy。

我该怎么做才能避免这种情况?是否有可能在数据透视表中建立一种歧视?还是我必须为每种子类创建一个特定的数据透视表?

最佳答案

在你的集合中你可以添加一个过滤器:

<set name="CollegeStudents" table="tstudent_course"
inverse="true">
<key>
<column name="id_course" not-null="true" />
</key>
<many-to-many entity-name="CollegeStudent" where="person_type='COLLEGE_STUDENT'">
<column name="id_person" not-null="true" />
</many-to-many>
</set>

恕我直言,如果没有那个过滤器(只是一组所有学生),映射会更好。

关于java - 使用相同的数据透视表与子类 hibernate 多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17542729/

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