Иерархический Hibernate, сколько запросов выполнено? - PullRequest
2 голосов
/ 18 мая 2010

Итак, я имел дело с фреймворком DB для домашнего пивоварения, у которого есть некоторые серьезные недостатки, оправдание для использования которого состоит в том, что отсутствие ORM сэкономит на количестве выполненных запросов.

Если я выбираю все возможные записи из верхнего уровня иерархии присоединяемых объектов, сколько отдельных вызовов в БД будет сделано при использовании ORM (например, Hibernate)?

Я чувствую, что это чушь, потому что объединяемые сущности должны быть выведены в одном запросе, верно? Я что-то здесь упускаю?

примечание: отложенная инициализация не имеет значения в этом сценарии, так как будут использоваться все записи.

Ответы [ 2 ]

1 голос
/ 27 мая 2010

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 с в зависимости от типа отображения.

0 голосов
/ 27 мая 2010

Боба прав,

Вы должны попробовать hibernate, чтобы увидеть, сколько запросов будет отправлено в базу данных, однако в hibernate вы также можете указать и настроить конкретный запрос с помощью HQL.

В дополнение к инструментам гибернации вы также можете использовать драйвер P6spy , чтобы вы могли видеть все запросы, отправляемые в спящий режим в вашу базу данных, со значением для каждого фильтра запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...