Que contrôle exactement la stratégie de récupération de JPA? Je ne peux détecter aucune différence entre impatient et paresseux. Dans les deux cas, JPA / Hibernate ne joint pas automatiquement les relations plusieurs-à-un.
Exemple: la personne a une seule adresse. Une adresse peut appartenir à plusieurs personnes. Les classes d'entités annotées JPA ressemblent à:
@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;
}
Si j'utilise la requête JPA:
select p from Person p where ...
JPA / Hibernate génère une requête SQL à sélectionner dans la table Person, puis une requête d'adresse distincte pour chaque personne:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
C'est très mauvais pour les grands ensembles de résultats. S'il y a 1000 personnes, il génère 1001 requêtes (1 de Person et 1000 distinctes de Address). Je le sais parce que je regarde le journal des requêtes de MySQL. J'ai cru comprendre que la définition du type de récupération d'adresse sur impatient entraînera JPA / Hibernate à interroger automatiquement avec une jointure. Cependant, quel que soit le type d'extraction, il génère toujours des requêtes distinctes pour les relations.
Ce n'est que lorsque je lui dis explicitement de se joindre qu'il rejoint réellement:
select p, a from Person p left join p.address a where ...
Est-ce que j'ai râté quelque chose? Je dois maintenant coder chaque requête pour qu'elle rejoigne les relations plusieurs-à-un. J'utilise l'implémentation JPA d'Hibernate avec MySQL.
Edit: Il apparaît (voir FAQ Hibernate ici et ici ) qui FetchType
n'a pas d'impact sur les requêtes JPA. Donc, dans mon cas, je lui ai explicitement dit de se joindre.