Що саме контролює стратегія вибору 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.
Редагувати: З'являється (див. FAQ про сплячку тут і тут ), що FetchType
не впливає на запити JPA. Тому в моєму випадку я прямо кажу йому приєднатися.