Таблица на подкласс (без использования дискриминатора)

В разделе 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 запроса.


person David Newcomb    schedule 21.10.2015    source источник


Ответы (1)


Если вы посмотрите на запрос, у него будет какой-то оператор switch, подобный приведенному ниже.

select
    account0_.id as id1_9_,
    account0_.balance as balance2_9_,
    account0_1_.checkLimitAmount as checkLim1_10_,
    account0clazz_.atmLimit as atmLimit1_11_,
    case 
        when account0_1_.id is not null then 1 
        when account0clazz_.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 account0clazz_ 
        on account0_.id=account0clazz_.id

поэтому он выполняет только один запрос. Затем Hibernate использует столбец clazz_, чтобы выяснить, что создавать. Вышеупомянутый запрос взят из HSQLDB и может отличаться для других движков БД.

Обычно рекомендуется распечатать операторы SQL, которые генерирует JPA / Hibernate (по крайней мере, в вашей локальной среде), поскольку иногда вы будете удивлены DML, который он генерирует.

person Augusto    schedule 21.10.2015