Что именно контролирует стратегия извлечения JPA? Я не вижу разницы между нетерпеливым и ленивым. В обоих случаях JPA / Hibernate не присоединяется автоматически к отношениям «многие к одному».
Пример: у человека один адрес. Адрес может принадлежать многим людям. Аннотированные классы сущностей JPA выглядят так:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
Если я использую запрос JPA:
select p from Person p where ...
JPA / Hibernate генерирует один запрос SQL для выбора из таблицы Person, а затем отдельный запрос адреса для каждого человека:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Это очень плохо для больших наборов результатов. Если есть 1000 человек, он генерирует 1001 запрос (1 от Person и 1000 от Address). Я знаю это, потому что смотрю журнал запросов MySQL. Насколько я понимаю, установка типа выборки адреса на нетерпеливое приведет к тому, что JPA / Hibernate автоматически запросит соединение. Однако, независимо от типа выборки, он по-прежнему генерирует отдельные запросы для отношений.
Только когда я явно говорю ему присоединиться, он действительно присоединяется:
select p, a from Person p left join p.address a where ...
Я что-то упустил? Теперь мне нужно передать код для каждого запроса, чтобы он оставался соединенным с отношениями «многие к одному». Я использую реализацию JPA Hibernate с MySQL.
Изменить: похоже (см. Часто задаваемые вопросы о Hibernate здесь и здесь ), что FetchType
не влияет на запросы JPA. Так что в моем случае я прямо сказал ему присоединиться.