Hibernate почти всегда будет извлекать иерархии объектов, используя один запрос; Я не помню, чтобы это происходило иначе. В любом случае это легко проверить. С этим очень простым отображением:
@Entity
public static class Person {
@Id
public String name;
}
@Entity
public static class Student extends Person {
public float averageGrade;
}
@Entity
public static class Teacher extends Person {
public float salary;
}
Тогда Hibernate дает мне следующие результаты для очень простого запроса просмотра (sessionFactory.openSession().createCriteria(Person.class).list();
).
С @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
на родителе:
select this_.name as name0_0_, this_.averageGrade as averageG3_0_0_,
this_.salary as salary0_0_, this_.DTYPE as DTYPE0_0_ from HibernateTest$Person this_
С @Inheritance(strategy = InheritanceType.JOINED)
на родителе:
select this_.name as name0_0_, this_1_.averageGrade as averageG1_1_0_,
this_2_.salary as salary2_0_, case when this_1_.name is not null then 1
when this_2_.name is not null then 2 when this_.name is not null then 0
end as clazz_0_ from HibernateTest$Person this_ left outer
join HibernateTest$Student this_1_ on this_.name=this_1_.name left outer join
HibernateTest$Teacher this_2_ on this_.name=this_2_.name
С @Inheritance(strategy = InheritanceType.JOINED)
на родителе:
select this_.name as name0_0_, this_.averageGrade as averageG1_1_0_,
this_.salary as salary2_0_, this_.clazz_ as clazz_0_ from
( select null as averageGrade, name, null as salary, 0 as clazz_
from HibernateTest$Person union select averageGrade, name, null as salary,
1 as clazz_ from HibernateTest$Student union select null as averageGrade,
name, salary, 2 as clazz_ from HibernateTest$Teacher ) this_
Как видите, каждый представляет собой один запрос с JOIN
с или UNION
с в зависимости от типа отображения.