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

时间:2015-10-21 14:53:08

标签: hibernate discriminator

10.1.2部分。每个子类的表它讨论了通过跨多个表的一对一映射创建继承。

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

当互联网上的所有例子都谈到"每个子类的表格"他们实际上是在谈论 10.1.3。每个子类的表:使用鉴别器

我的问题是 10.1.2。每个子类的表知道在没有鉴别器列的情况下实例化哪个类。

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

1 个答案:

答案 0 :(得分: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感到惊讶。