Table 每个 Class 层次结构 - 仅获取具有条件 API 的超类,鉴别器不起作用?

Table per Class hierarchy - get only Superclass with Criteria API, discriminator not working?

我有 Table per Class 层次结构,有 3 个 classes,Academy:

@Entity
@Table(name = "academy")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(
        name="hibernate_hierarchy_discriminator",
        discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value="ACADEMY")
public class Academy {
//
}

Class Institute,它扩展了 Academy:

@Entity
@Table(name = "institute")
@DiscriminatorValue(value="INSTITUTE")
public class Institute extends Academy{
//
}

和 class Department,它扩展了 Instutute:

@Entity
@Table(name = "department")
@DiscriminatorValue(value="DEPARTMENT")
public class Department extends Institute{
//
}

当我保存特定实体时,它看起来还不错 - 例如我看到 discriminator 列。但是当我保存一个 Academy、一个 Institute 和一个 Department - 我试图只获得学院时,我得到了 3 个元素,但我希望只有一个 - 列表不仅包含 Academy 还有 InstituteDepartment。我创建了一个单元测试来说明我的意思:

@Test
@Transactional
public void test_WhenOneAcademyIsSaved_OneAcademyShouldBeRead() throws Exception {
    //tables are empty before test

    final Academy academy = new Academy("Michigan", "Main street");
    getCurrentSession().save(academy);
    final Institute institute = new Institute("Michigan", "Main street", "IT", "C", academy);
    getCurrentSession().save(institute);
    getCurrentSession().save(new Department("Michigan", "Main street", "IT", "C", "333 333 333", "Programming", institute));

    List<Academy> academies = (List<Academy>)getCurrentSession()
        .createCriteria(Academy.class)
        .list();
    assertEquals(1, academies.size()); //size is 3
}

(这也是树结构,Academy有一个Instutute的列表,Institute有一个Department的列表,但我认为确实如此在我的问题中无关紧要)。我认为 discriminator 专栏关心区分不同的 class 实例,如果我为 Academy 创建标准,我将只获得学院。当使用 Table per Class 层次结构时,是否有解决方案可以仅获取具有 Criteria API 的基础 class 实例?

您不需要 @DiscriminatorValue 用于 TABLE_PER_CLASS 继承策略,因为为每个子 class 创建了一个新的 table。请注意,当您使用 SINGLE_TABLE 或 JOINED 继承策略时,描述符是必需的。 cases 上方的 descriminator 列有助于 hibernate 在从单个或公共 table.

获取数据时区分不同的子 classes

我是这样解决的: 因为我需要区分父实体 Academy 和子实体 Institute 我决定删除显式继承。相反,我创建了 BaseAcademy class Academy 继承的 BaseInstituteInstitute 继承的 BaseInstitute 。现在,没有 "Hibernate" 继承,但是 BaseInstitute class 继承自 BaseAcademy。我不知道这是否是好的解决方案,但此时一切正常。