IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Persistance des données Java Discussion :

Java, DAO et Jointures entre tables


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut 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 : 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
    En Java :
    objet Pays :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private id
    private libelle
    private Liste<ville>
    objet ville
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private id
    private libelle
    objet PaysDAO :
    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=?;
    }
    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=?;
    }
    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

  2. #2
    Membre chevronné Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Par défaut
    Citation Envoyé par johannsan Voir le message

    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?

    Tu fais une requête (avec jointure bien sur) qui te remonte les champs que tu veux binder puis tu parcours ton resultSet pour créer tes objets. Dans ton cas tu es en SQL pur donc pas de surprise.

    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...
    Pour moi ton objet ville doit contenir un objet pays => ville.getPays.getLibelle(). Après je ne suis pas sur d'avoir tout compris mais ton objet villeDAO te retourne des objets ville et idem pour pays. Et bien sur on utilise les getters et setters
    Je pense que tu veux confond les champs qui correspondent aux entêtes de colonnes en BDD et les attributs respectifs des tes objets.


    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? C'est toi qui crée tes objets donc si tu veux remplir une liste
    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? Hibernate, JPA
    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
    Je t'invite à te renseigner plus sur la persistance en JAVA. Pour ma part j'ai très peu utiliser les DAOs sans fwk de persistance donc il y a surement des techniques qui permettent de faire du lazy ou autre sans utiliser de fwk
    N'hésites à faire un projet test...

  3. #3
    Invité
    Invité(e)
    Par défaut
    En effet, je me suis orienté sur hibernate, donc tout se fait tout seul...

Discussions similaires

  1. Jointure entre table de différentes bases de données
    Par iLoLo21 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 19/01/2009, 14h35
  2. [1.x] jointure entre tables de bd différentes symfony
    Par jemele dans le forum Symfony
    Réponses: 2
    Dernier message: 07/07/2008, 10h03
  3. jointure entre tables de bases différentes
    Par mcdelay dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/04/2007, 12h56
  4. Maximum authorisé de jointure entre tables
    Par Arkane dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/12/2006, 17h49
  5. Réponses: 2
    Dernier message: 10/10/2006, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo