Bonjour.
Je me pose une question sur l'utilisation des DAO lorsqu'on souhaite faire des jointures entre deux tables.
Prenons l'exemple deux deux tables Pays et ville
En base :
En Java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 table Pays : pays_id pays_libellé table ville : ville_id ville_libelle pays_id
objet Pays :
objet ville
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 private id private libelle private Liste<ville>
objet PaysDAO :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 private id private libelle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 private table="PAYS" private id = "ID" private libelle = "LIBELLE" public findAll() {... select * from table; } public find(id) {... select * from table where id=?; }Question 1/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 objet villeDAO private table="VILLE" private id = "ID" private libelle = "LIBELLE" private id_pays= "pays_id" public findAll() {... select * from table; } public find(id) {... select * from table where id=?; }
Comment, avec le pattern DAO, pouvons nous faire une jointure entre la table VILLE et pays.
En effet, si on recherche toutes les villes, puis pour toutes les villes on fait un find(pays de la ville), cela fait perdre tout l'interet des jointures SQL car on va faire N+1 requetes au lieu d'une?
De même, dans la classe villeDAO, nous ne somme pas sensé avoir accès aux noms des champs de la classe paysDAO car ils sont privés. Faut-il alors mettre les différents champs des DAO en public? (afin d'éviter de faire des get).
PS : après avoi lu la doc suivante : http://cyrille-herby.developpez.com/...tern-dao/#LIII, on remarque que les noms des champs et des tables ne sont pas en variable mais en dur (ce qui me parait pas très propre), mais peut etre que je me trompe.
Question 2/
Dans l'exemple ci-dessus, le pays contient une liste de pays, mais la ville ne contient pas la référence au pays.
--> comment décider si ces références doivent être dans les deux sens ou que dans un sens?
De même, si on gère ces références dans tous les sens, on voit bien qu'à force de charger tous les objets qui sont liés, on peut aller très loin (car chaque objet va charger son objet "voisin".
Comment expliciter en java qu'on ne doit pas charger tous les objets en cascade?
De même si on décide de ne pas les charger tous? comment savoir si on l'a chargé ou pas (afin de le charger s'il ne l'est pas), et afficher une valeur null à tord...
Merci d'avance pour vos réponses
Partager