Il est rare d'utiliser le mode de récupération EAGER
pour une association 1-N comme il est fait ici pour l'association entre CompteBancaire
et OperationBancaire
.
Dnas certains cas la récupération des opérations associées à un compte est facilitée par le mode de récupération EAGER
. Cependant, si on veut seulement utiliser les noms des possesseurs des comptes, il est inutilement coûteux de récupérer pour cela toutes les opérations bancaires effectuées sur les comptes.
En exercice optionnel, quand vous aurez terminé le TP, vous pourrez enlever ce mode de récupération et garder le mode par défaut (LAZY
pour une association 1-N). Même si vous ne faites pas cet exercice, lisez ce qui suit et essayez de comprendre.
Dans cet exercice, pour afficher la liste des comptes quand l'utilisateur clique sur un lien vers les opérations bancaires dans la page customerList.xhtml
, il faudra alors
select
avec un join fetch
pour récupérer dès le début la liste des comptes avec toutes les opérations bancaires, select
SQL. Ce select
est déclenché explicitement dans votre code (avec une instance de Query
) ou bien, si le compte est toujours géré par un EntityManager
, sera lancé automatiquement par l'EntityManager
. N'oubliez pas que, si vous avez configuré votre fichier persistence.xml
comme il a été demandé, vous pouvez voir les requêtes SQL lancées par JPA dans les logs du serveur d'application. Testez en commençant par ne pas ajouter de select
explicite ; si ça ne marche pas, ajoutez le select
.Je vous ai donné l'ensemble des solutions possibles lorsqu'on veut récupérer des entités associées (EAGER, join fetch, select explicite, select implicite). Chaque cas est particulier et doit être analysé et vérifié avec des tests.
Si les performances sont mauvaises, pensez au fameux problème des "N + 1 selects", étudié en cours, qui peut arriver à chaque fois que vous récupérez des données dans une base de données, même si vous n'utilisez pas JPA.