Java, DAO et Jointures entre tables
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 :
Code:
1 2 3 4 5 6 7 8
| table Pays :
pays_id
pays_libellé
table ville :
ville_id
ville_libelle
pays_id |
En Java :
objet Pays :
Code:
1 2 3
| private id
private libelle
private Liste<ville> |
objet ville
Code:
1 2
| private id
private libelle |
objet PaysDAO :
Code:
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=?;
} |
Code:
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=?;
} |
Question 1/
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