спячка и странность jpa; неожиданная ленивая загрузка - PullRequest
4 голосов
/ 10 мая 2011

Я использую довольно старую версию Hibernate (3.2.4), так что, возможно, это связано с этим. К сожалению, требования проекта не позволяют мне обновиться.

У меня есть класс Foo с ассоциацией «многие к одному» с Баром Ассоциация помечена:

lazy="false" fetch="join"

Теперь, когда я делаю что-то вроде:

em.find(Foo.class, id);

Я получаю ожидаемый результат: оператор single , соединяющий таблицу FOO с таблицей BAR. Тем не менее, когда я пытаюсь что-то вроде:

em.createQuery("select f from Foo where f.id = :id")
.setParameter("id", id)
.getSingleResult();

Я получаю одиночное соединение с последующим дополнительным запросом выбора к BAR. Второй запрос выглядит как совершенно лишним ; все данные, необходимые для быстрого заполнения экземпляра Foo, должны были быть доступны при первоначальном объединении. Это выглядит примерно так:

select f.id, f.xyz, ..., b.id, b.xyz, ... 
from foo f 
join bar b on b.id = f.bar_id 
where f.id = ?

select b.id, b.xyz, ... 
from bar b 
where b.id = ?

Есть мысли?

1 Ответ

2 голосов
/ 10 мая 2011

Hibernate не уважает fetch = "join" при выполнении запросов HQL.Из документации :

Стратегия выборки, определенная в документе сопоставления, влияет на:

  • извлечение с помощью get () или load ()
  • извлечение, которое происходит неявно при навигации по ассоциации
  • Критерии запросов
  • HQL-запросов, если используется выборочная выборка

В случае HQLзапросы, которые вы должны использовать left join fetch:

em.createQuery("select f from Foo f left join fetch f.bar where f.id = :id")
    .setParameter("id", id)
    .getSingleResult(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...