Я запустил код в точности так, как он показан выше, и он демонстрирует указанное поведение.
менно контролирует стратегия извлечения 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 от человека и 1000 отличается от адреса). Я знаю это, потому что я просматриваю журнал запросов MySQL. Насколько я понимаю, установка типа извлечения адреса на eager приведет к тому, что JPA / Hibernate автоматически запросит соединение. Тем не менее, независимо от типа выборки, он по-прежнему генерирует различные запросы для отношений.
Только когда я явно говорю ему присоединиться, он действительно присоединяется:
select p, a from Person p left join p.address a where ...
Я что-то здесь упускаю? Теперь я должен написать код каждого запроса, чтобы он оставил соединение «многие-к-одному». Я использую реализацию JPA Hibernate с MySQL.
Редактировать: Похоже (см. Hibernate FAQВот а такжеВот) этоFetchType
не влияет на запросы JPA. Так что в моем случае я прямо сказал, чтобы присоединиться.