Che cosa fa esattamente il controllo della strategia di recupero di JPA? Non riesco a rilevare alcuna differenza tra desideroso e pigro. In entrambi i casi JPA / Hibernate non unisce automaticamente le relazioni molti-a-uno.
Esempio: la persona ha un unico indirizzo. Un indirizzo può appartenere a molte persone. Le classi di entità annotate JPA hanno il seguente aspetto:
@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;
}
Se utilizzo la query JPA:
select p from Person p where ...
JPA / Hibernate genera una query SQL da selezionare dalla tabella Person, quindi una query di indirizzo distinta per ogni persona:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Questo è molto negativo per set di risultati di grandi dimensioni. Se ci sono 1000 persone, genera 1001 query (1 da Persona e 1000 distinte da Indirizzo). Lo so perché sto guardando il registro delle query di MySQL. Sapevo che l'impostazione del tipo di recupero dell'indirizzo su eager farà sì che JPA / Hibernate interroghi automaticamente con un join. Tuttavia, indipendentemente dal tipo di recupero, genera comunque query distinte per le relazioni.
Solo quando gli dico esplicitamente di aderire, effettivamente si unisce:
select p, a from Person p left join p.address a where ...
Mi manca qualcosa qui? Ora devo codificare a mano ogni query in modo che si unisca alle relazioni molti-a-uno. Sto usando l'implementazione JPA di Hibernate con MySQL.
Modifica: sembra (vedere le domande frequenti su Hibernate qui e qui ) che FetchType
non influisce sulle query JPA. Quindi nel mio caso ho detto esplicitamente di aderire.