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

JPA Java Discussion :

[EJB3] jointure de table: @ManyToMany


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 568
    Par défaut [EJB3] jointure de table: @ManyToMany
    Bonjour.

    comme j'ai toujours pas résolu mon problème, je vais essayer de reformuler ma question

    je veux faire des requête EJB3 QL avec des jointure.

    voici mes tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TABLE `umlssnmi` (
      `AUIS` varchar(20) NOT NULL default '',
      `CUI` varchar(20) NOT NULL default '',
      `CODE` varchar(20) NOT NULL default '',
      `TTY` varchar(5) NOT NULL default '',
      `STR` varchar(255) NOT NULL default '',
      `HIER` varchar(255) NOT NULL default '',
      `PROF` tinyint(2) NOT NULL default '0',
      `AXE` char(1) NOT NULL default 'D',
      PRIMARY KEY  (`AUIS`),
      KEY `CODE` (`CODE`),
      KEY `TTY` (`TTY`),
      KEY `CUI` (`CUI`),
      KEY `AXE` (`AXE`)
    ) TYPE=MyISAM;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     CREATE TABLE `whoart` (
      `AUIW` varchar(10) NOT NULL default '',
      `CODE` varchar(10) NOT NULL default '',
      `STR` varchar(255) NOT NULL default '',
      `FSTR` varchar(255) NOT NULL default '',
      `SOC` varchar(5) NOT NULL default '',
      `SEMTYPE` varchar(5) NOT NULL default '',
      `SRC` enum('WA','CIM') NOT NULL default 'WA',
      PRIMARY KEY  (`AUIW`),
      KEY `SOC` (`SOC`),
      KEY `CODE` (`CODE`)
    ) TYPE=MyISAM;
    Sachant que j'ai la table suivante qui a comme clès primaires les deux clès primaires des tables précedente.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE `wasnmi` (
      `AUIW` varchar(20) NOT NULL default '',
      `AUIS` varchar(20) NOT NULL default '',
      `MODIF` varchar(10) default NULL,
      `SRC` enum('S','MW','MS','MA') NOT NULL default 'S',
      PRIMARY KEY  (`AUIW`,`AUIS`),
      KEY `MOD` (`SRC`),
      KEY `MODIF` (`MODIF`)
    ) TYPE=MyISAM;
    sachant que la cardinalité entre ces tables et ManyToMany, ma question et de savoir si pour que je puisse faire une jointure entre mes tables je dois créer des tables intermédiares qui contiennent que les clès primaires genre umlssnmi_wasnmi et whoart_wasnmi par exemple, et faire des @JoinTable; ou bien la table "wasnmi" faira l'affaire.

    je vous prie de m'orienter afin que je puisse décoller; cela me fait 6 jours d'escale

  2. #2
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    D'apres la description de tes tables, tu as une relation n-n entre umlssnmi et whoart, la table de lien est wasnmi.
    Si c'est le cas, alors il te suffit de déclarer 2 relations n-1 entre wasnmi et umlssnmi d'une part, et wasnmi et whoart d'autre part.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 568
    Par défaut
    Bonjour
    Je vous remercie pour votre réponse que j’ai essayé d'implémenter comme suit :

    Pour la table WHOART :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class TermSource implements Serializable {
    []
    @OneToMany (mappedBy="auiw")
        private Collection<TermProjPK> termProjPks;
     
        public Collection<TermProjPK> getTermProjPks() {
            return termProjPks;
        }
     
        public void setTermProjPks(Collection<TermProjPK> termProjPks) {
            this.termProjPks = termProjPks;
        }
    []
    }
    Pour la table UMLSSNMI:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class SnomedInter implements Serializable {
    []
    @OneToMany (mappedBy="auis")
        private Collection<TermProjPK> termProjPks;
     
        public Collection<TermProjPK> getTermProjPks() {
            return termProjPks;
        }
     
        public void setTermProjPks(Collection<TermProjPK> termProjPks) {
            this.termProjPks = termProjPks;
        }
    []
    }
    La classe TermProjPK qui contient les clés primaries de la table WASNMI:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    @Embeddable
    public class TermProjPK implements Serializable {
    []
    @ManyToOne
        @JoinColumn(name = "AUIW", nullable = false)
        private String auiw;
        private Collection<TermSource> termSources;
     
        public Collection<TermSource> getTermSources() {
            return termSources;
        }
     
        public void setTermSources(Collection<TermSource> termSources) {
            this.termSources = termSources;
        }
    @ManyToOne
        @JoinColumn(name = "AUIS", nullable = false)
        private String auis;
        private Collection<SnomedInter> snomedInters;
     
        public Collection<SnomedInter> getSnomedInters() {
            return snomedInters;
        }
     
        public void setSnomedInters(Collection<SnomedInter> snomedInters) {
            this.snomedInters = snomedInters;
        }
    []
    }

    Pour la table WASNMI:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class TermProj implements Serializable {    
     
        @EmbeddedId
        protected TermProjPK termProjPK;
     
        @Column(name = "MODIF")
        private String modif;
     
        @Column(name = "SRC", nullable = false)
        private String src;
    []
    }
    Ça ne marche pas, parce que je ne sais toujours pas comment je peux accéder aux champs ‘MODIF’ et ‘SRC’ de la table ‘WASNMI’ à partir de d’un objet TermSource.

    quelqu’un aurait une idée?. Toute suggestion sera la bien venue.

  4. #4
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    Tu ne dois mapper les Pk, mais les objets eux-mêmes !!!
    TermSource et SnomedInter doivent avoir une collection de TermProj, et pas de FK.
    De même, TermProj doir avoir un lien direct vers 1 TermSource seulement et 1 SnomedInter d'autre part.
    C'est HIBERNATE qui se charge de gérer les clés elles-mêmes ! Nous, on ne gère que les objets.

    TermSource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        @OneToMany (mappedBy="auiw")
        private Collection<TermProj> termProjs;
        // ajouter les accesseurs
    SnomedInter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        @OneToMany (mappedBy="auis")
        private Collection<TermProj> termProjs;
        // ajouter les accesseurs
    TermProj :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        @ManyToOne
        @JoinColumn("column_pk_termSource")
        private TermSource auiw;
     
        @ManyToOne
        @JoinColumn("column_pk_SnomedInter")
       private SnomedInter auis;
     
        @Column(name = "MODIF")
        private String modif;
     
        @Column(name = "SRC", nullable = false)
        private String src;

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 568
    Par défaut
    Franchement je ne sais pas comment te remercier, vive la suisse!!
    sauf que j'ai quand même deux questions:

    primo: je ne sais pas ce que tu veux dire par "column_pk_termSource" et "column_pk_SnomedInter" est ce que je dois mettre auiw et auis à la place parce que c'est respectivement les clés primaires de TermSource et SnomedInter ou bien je peux mettre n'importe quelle chaine de caractére et c'est Hibernate qui s'occupe du reste .

    secondo: comment dans ce cas je peux acceder à un objet SnomedInter via un objet TermSource si dans ma servlet TermSourceServlet j'implemente comme suit par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    List news = termSourceFacade.findAll();
    for (Iterator it = news.iterator(); it.hasNext();) {
                TermSource elem = (TermSource) it.next();            
                Collection<TermProj> termProjs = elem.getTermProjs();            
                Iterator itTermProjs = termProjs.iterator();           
                while (itTermProjs.hasNext()) {              
                  TermProj termproj = (TermProj) itTermProjs.next();                
                  out.println(" <TR> <TD> <b>" + elem.getAuiw() + " </b> </TD> ");
                  out.println(" <TD> <b>" + termproj.getModif() + " </b> </TD></TR>");            
     
                }
    }
    merci encore, tu m'as eclairci beaucoup de choses

  6. #6
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    1)
    primo: je ne sais pas ce que tu veux dire par "column_pk_termSource" et "column_pk_SnomedInter" est ce que je dois mettre auiw et auis à la place parce que c'est respectivement les clés primaires de TermSource et SnomedInter ou bien je peux mettre n'importe quelle chaine de caractére et c'est Hibernate qui s'occupe du reste
    Ce sont les noms des colonnes où sont stockées les FK pour chaque table.
    2)
    secondo: comment dans ce cas je peux acceder à un objet SnomedInter via un objet TermSource si dans ma servlet TermSourceServlet j'implemente comme suit par exemple
    Je présuppose que tu as un getter sur auis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    List news = termSourceFacade.findAll();
    for (Iterator it = news.iterator(); it.hasNext();) {
                TermSource elem = (TermSource) it.next();            
                Collection<TermProj> termProjs = elem.getTermProjs();            
                Iterator itTermProjs = termProjs.iterator();           
                while (itTermProjs.hasNext()) {              
                  TermProj termproj = (TermProj) itTermProjs.next();                
                  out.println(" <TR> <TD> <b>" + elem.getAuiw() + " </b> </TD> ");
                  out.println(" <TD> <b>" + termproj.getModif() + " </b>  </TD> ");
                  out.println(" <TD> <b>" + termproj.getAuis() + " </b></TD></TR>");
                         
                }
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        @ManyToOne
        @JoinColumn("column_pk_SnomedInter")
       private SnomedInter auis;
       public SnomedInter getAuis() {
          return auis;
       }

    PS : pense a utiliser

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jointure de table avec Interbase
    Par ada_b dans le forum InterBase
    Réponses: 21
    Dernier message: 12/05/2010, 19h52
  2. Réponses: 7
    Dernier message: 10/02/2005, 00h13
  3. [FB1.5]Vue avec jointure sur tables ?
    Par Sitting Bull dans le forum SQL
    Réponses: 2
    Dernier message: 07/12/2004, 17h07
  4. jointure sur table et procedure stocké
    Par pram dans le forum SQL
    Réponses: 3
    Dernier message: 18/11/2004, 21h56
  5. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50

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