Я запустил код в точности так, как он показан выше, и он демонстрирует указанное поведение.

менно контролирует стратегия извлечения 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. Так что в моем случае я прямо сказал, чтобы присоединиться.

Ответы на вопрос(8)

Ваш ответ на вопрос