Table 每个子类(不使用鉴别​​器)

Table per subclass (without using a discriminator)

在第 10.1.2 节中。 Table 每个子class 它讨论了通过跨多个表的一对一映射创建继承。

https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#inheritance-tablepersubclass

当 Internet 上的所有示例都在谈论 "Table per subclass" 时,他们实际上在谈论 10.1.3。 Table 每个子class:使用鉴别器

我的问题是10.1.2怎么办。 Table 每个子class 知道在没有鉴别器列的情况下要实例化哪个 class。

如果答案是 hibernate 执行 3 个(或其他)额外查询来查找数据的位置,那么当鉴别器方法只保证 2 个查询时,您为什么要使用此方法。

如果您查看查询,它会包含某种类似下面的 switch 语句

select
    account0_.id as id1_9_,
    account0_.balance as balance2_9_,
    account0_1_.checkLimitAmount as checkLim1_10_,
    account0_2_.atmLimit as atmLimit1_11_,
    case 
        when account0_1_.id is not null then 1 
        when account0_2_.id is not null then 2 
        when account0_.id is not null then 0 
    end as clazz_ 
from
    INHERITANCE_JTND_ACCOUNT account0_ 
left outer join
    INHERITANCE_JTND_CHECKING_ACCOUNT account0_1_ 
        on account0_.id=account0_1_.id 
left outer join
    INHERITANCE_JTND_SAVINGS_ACCOUNT account0_2_ 
        on account0_.id=account0_2_.id

所以它只做一个查询。 Hibernate 然后使用 clazz_ 列来确定要实例化的内容。上面的查询来自 HSQLDB,对于其他数据库引擎可能有所不同。

打印 JPA/Hibernate 生成的 SQL 语句通常是个好主意(至少在您的本地环境中),因为有时您会对它生成的 DML 感到惊讶。