Что именно делает контроль стратегии 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 ...
Я что-то упустил? Теперь я должен передать код каждому запросу, чтобы он оставил соединение между собой. Я использую Hibernate JPA-реализацию с MySQL.
Изменить: Появится (см. Hibernate FAQ здесь и здесь), что FetchType
не влияет на запросы JPA. Поэтому в моем случае я прямо сказал, чтобы он присоединился.