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

  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

  7. #7
    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,
    Comme vous m'avez suggeré et c'est bien ce que j'ai trouvé dans les livres, voici mon code:

    TermProjPK.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Embeddable
    public class TermProjPK implements Serializable {
    private String auiw;
    @Column(name = "AUIS", nullable = false)
    private String auis;
    TermProj.java
    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
    30
    31
    32
    33
     
    public class TermProj implements Serializable {
    @EmbeddedId
        private TermProjPK termProjPK;
    //jointure avec la table TermSource
        @ManyToOne
        @JoinColumn (name = "AUIW")
        private TermSource  auiw;  
        public TermSource getAuiw() {
            return auiw;
        }
     
        public void setAuiw(TermSource auiw) {
            this.auiw = auiw;
        }    
     
     
        //jointure avec la table SnomedInter   
        @ManyToOne 
        @JoinColumn (name = "AUIS")
        private SnomedInter auis;
        public SnomedInter getAuis() {
            return auis;
        }
     
        public void setAuis(SnomedInter auis) {
            this.auis = auis;
        }
    @Column(name = "MODIF")
        private String modif;
     
        @Column(name = "SRC", nullable = false)
        private String src;
    TermSource.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class TermSource implements Serializable {
     @Id
        @Column(name = "AUIW", nullable = false)
        private String auiw;
    @OneToMany(mappedBy="AUIW")
        private Collection<TermProj> termProjs;
     
         public Collection<TermProj> getTermProjs() {
            return termProjs;
        }
     
        public void setTermProjs(Collection<TermProj> termProjs) {
            this.termProjs = termProjs;
        }
    SnomedInter.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class SnomedInter implements Serializable {
    @Id
        @Column(name = "AUIS", nullable = false)
        private String auis;
    @OneToMany(mappedBy="AUIS")
        private Collection<TermProj> termProjs;
     
        public Collection<TermProj> getTermProjs() {
            return termProjs;
        }
     
        public void setTermProjs(Collection<TermProj> termProjs) {
            this.termProjs = termProjs;
        }
    malheureusement j'arrive pas à faire la jointure, et j'ai toujours l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.AnnotationException: mappedBy reference an unknown property: ejb.entity.TermProj.AUIS in ejb.entity.SnomedInter.AUIS
    je vous remercie d'avance

  8. #8
    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
    dans "mappedby", on ecrit le nom de l'attribut de la classe référencée, et pas la colonne.
    Essaye avec mappedby="auis" en minuscule.

  9. #9
    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 de m'avoir répondu
    entre temps j'avais déjà essayé de les mettre en minuscule, mais quand je fais ça, le problème devient au niveau de la servlet,
    TermSourceServlet.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for (Iterator it = news.iterator(); it.hasNext();) {
                TermSource elem = (TermSource) it.next();            
                 Collection<TermProj> termProjs = elem.getTermProjs();            
                 Iterator itTermProjs = (Iterator) termProjs.iterator();           
               while (itTermProjs.hasNext()) {              
                  TermProj termproj = (TermProj) itTermProjs.next();                
                  out.println(" <TR> <TD> <b>" + elem.getAuiw() + " </b> </TD> ");
                  out.println(" <TD> <b>" + elem.getCode() + " </b> </TD>");
                  out.println(" <TD> <b>" + termproj.getModif() + " </b> </TD></TR>");            
     
               }
            }
    j'obtiens l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR [LazyInitializationException] failed to lazily initialize a collection of role: ejb.entity.TermSource.termProjs, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ejb.entity.TermSource.termProjs, no session or session was closed
    j'ai essayé @OneToMany(mappedBy="auiw", fetch = FetchType.EAGER) et @OneToMany(mappedBy="auis", fetch = FetchType.EAGER) mais appremment ce n'est pas la bonne solution.
    je sais que c'est juste un problème de cascade mais j'arrive toujours pas à savoir ce que c'est. je pense que le fait d'utliser une classe pour les clès étrangères, crée problème parce que dans les livres que j'ai lu on n'utlise pas @Embeddable et @EmbeddedId mais souvent @IdClass
    quand j'utilise @ManyToMany, ça marche très bien mais dans mon cas ce n'est pas juste une classe de jointure mais plutôt une association qui contient d'autres champs que les clès étrangéres, et il faut bien que je puisse y accéder

    je vous remercie encore.

  10. #10
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Par défaut
    Cette erreur vient du fait que vous n'avez pas préchargé la collection : termProjs !

    En effet, dans les EJB3, les relations de type OneToMany, ManyToMany se charge en mode "lazy" (ou à la demande).

    Si vous tentez d'accéder à une collection à chagement "lazy" en dehors de la session (ici Hibernate) et bien il est impossible à la collection de se charger !

    Pour résoudre cela, il faut précharger la collection dans l'ejb Session utilisé via :
    elem.getTermProjs().size(); (par exemple).

    En espérant que cela puisse vous aider !

    Cordialement,

    Cyril JOUI

  11. #11
    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 beaucoup pour votre réponse;
    j'ai changé ma servlet en mettant :
    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
     
    TermSourceFacadeLocal termSourceFacade = (TermSourceFacadeLocal) lookupTermSourceFacade();
    List news = termSourceFacade.findAll();
    [...]
    for (Iterator it = news.iterator(); it.hasNext();) {
                TermSource elem = (TermSource) it.next(); 
                elem.getTermProjs().size();
                Collection<TermProj> termProjs = elem.getTermProjs();            
                Iterator itTermProjs = (Iterator) 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>");                
                }
    }
    malheureuement j'ai toujours la même erreure
    est ce que je dois pas ajouter d'autres instructions au niveau de ma session Bean
    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
     
    @Stateless
    public class TermSourceFacade implements TermSourceFacadeLocal, TermSourceFacadeRemote {
     
        @PersistenceContext
        private EntityManager em;
        [...]
        public TermSource find(Object pk) {
            return (TermSource) em.find(TermSource.class, pk);
        }
     
        public List findAll() {
            return em.createQuery("select object(o) from TermSource as o ORDER BY o.soc,o.fstr,o.str").getResultList();
        }
        [...]
    }
    je vous remercie d'avance

  12. #12
    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
    Comme l'a dit popomcorp, il faut charger les listes au sein de la transaction hibernate, à savoir DANS la methode findAll().
    Code non testé (au type près):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public List findAll() {
        List elems = em.createQuery("select object(o) from TermSource as o ORDER BY o.soc,o.fstr,o.str").getResultList();
     
        // boucle sur les elements pour charger en memoire les listes 1-n
        for (elem : elems) {
            elem.getTermProjs().size();
        }
        return elems;
    }

  13. #13
    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
    En fait l'application cliente (dans mon cas c'est la TermSourceServlet) récupére une entité et tente d'accéder à un champ relationnel non initialisé ( getTermProjs()), alors que la propriété demandée n'a pas tété initialisée,
    j'ai donc implementé dans la session bean (TermSourceFacade) la methode findAll()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public List findAll() {
        List elems = em.createQuery("select object(o) from TermSource as o ORDER BY o.soc,o.fstr,o.str").getResultList();
     
        // boucle sur les elements pour charger en memoire les listes 1-n
        for (Iterator it = elems.iterator(); it.hasNext();){
            TermSource elem = (TermSource) it.next();
            elem.getTermProjs().size();
        }
        return elems;
        }
    mais appremment ça marche toujours pas
    merci pour votre aide

  14. #14
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Par défaut
    Bonjour,

    Avez vous la même erreur ?
    Le code me semble tout à fait correct pourtant ...

    Si l'erreur est différente, pouvez vous nous donner la stacktrace .. svp ?

    Cyril

  15. #15
    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,
    Merci de m'avoir répondu
    Comme ça n'a toujours pas marché, entre temps j'ai changé la requ^te dans méthode findAll() et j'ai utilisé le FETH JOIN comme suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public List findAll() {
            //return em.createQuery("select object(o) from TermSource as o ORDER BY o.soc,o.fstr,o.str").getResultList();
            return em.createQuery("select object(o) from TermSource as o inner join fetch o.termProjs ORDER BY o.soc,o.fstr,o.str").getResultList();
     }
    mais j'arrive pas à executer cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR [[TermSourceServlet]] Servlet.service() for servlet TermSourceServlet threw exception
    javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
    je sais pas trop d'où vient l'erreur!!,
    j'ai aussi un doute, remarquez que c'est les entity beans TermSource et SnomedInter qui contient respectivement l'annotation @OneToMany(mappedBy="auiw") et @OneToMany(mappedBy="auis") alors que l'entiy bean TermProj contient
    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
      //jointure avec TermSource    
    @ManyToOne
        @JoinColumn (name = "AUIW")
        private TermSource auiw;
    private TermSource auiw;  
         public TermSource getAuiw() {
            return auiw;
        }
     
        public void setAuiw(TermSource auiw) {
            this.auiw = auiw;
        } 
     
        //jointure avec SnomedInter    
        @ManyToOne 
        @JoinColumn (name = "AUIS")
        private SnomedInter auis;
        public SnomedInter getAuis() {
            return auis;
        }
     
        public void setAuis(SnomedInter auis) {
            this.auis = auis;
        }
    est ce que je dois pas plutôt appeler TermSource à partir de TermProj et pas l'inverse !!

    je vous remercie d'avance.

  16. #16
    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
    J'ai essayé de faire l'inverse, mais ça marche pas quand même.
    si vous avez une idée n'hésitez pas, merci d'avance.

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Pourquoi faire un objetc(o) ?

    et si tu fais ça simplement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select o from TermSource as o inner join fetch o.termProjs ORDER BY ...

  18. #18
    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,
    merci de m'avoir répondu.
    entre temps j'avais essayé votre syntax de requête, mais j'avais toujours la même erreur !, en fin de compte le problème ne vient pas de la syntaxe EJB-QL mais plutôt de la jointure des entity:donc j'ai changé le nom de la clé primaire dans SnomedInter j'ai mis SNOMEDINTER_AUIS à la place de AUIS, de même pour TERMSOURCE_AUIW à la place de AUIW pour éviter d'avoir le même nom que les clé étrangères dans TermProj,
    mon code est devenu comme suit:

    TermProjPK.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Embeddable
    public class TermProjPK implements Serializable {
    private String auiw;
    @Column(name = "AUIS", insertable = false, updatable = false, nullable = false)
     private String auis;
    [...]
    TermProj.java
    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
    30
    31
    32
    33
    34
    35
    @Entity
    @Table(name = "wasnmi")
    public class TermProj implements Serializable {   
     
        @EmbeddedId
        private TermProjPK termProjPK;   
     
        //jointure avec la table WHOART
        @ManyToOne
        @JoinColumn (name = "AUIW")
        private TermSource termSource; 
         public TermSource getTermSource() {
            return termSource;
        }
     
        public void setTermSource(TermSource termSource) {
            this.termSource = termSource;
        }
        //jointure avec la table UMLSSNMI    
        @ManyToOne 
        @JoinColumn (name = "AUIS", insertable = false, updatable = false)
        private SnomedInter snomedInter;
        public SnomedInter getSnomedInter() {
            return snomedInter;
        }
     
        public void setSnomedInter(SnomedInter snomedInter) {
            this.snomedInter = snomedInter;
        }
         @Column(name = "MODIF")
        private String modif;
     
        @Column(name = "SRC", nullable = false)
        private String src;
    [...]
    TermSource.java

    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
    @Entity
    @Table(name = "whoart")
    public class TermSource implements Serializable {
    @Id
        @Column(name = "TERMSOURCE_AUIW", nullable = false)
         private String termsource_auiw;
         [...]
    @OneToMany(mappedBy="termSource")
         private Collection<TermProj> termProjs;    
     
         public Collection<TermProj> getTermProjs() {
            return termProjs;
        }
     
        public void setTermProjs(Collection<TermProj> termProjs) {
            this.termProjs = termProjs;
        } [...]
    SnomedInter.java
    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
    @Entity
    @Table(name = "umlssnmi")
    public class SnomedInter implements Serializable {
     
        @Id
        @Column(name = "SNOMEDINTER_AUIS", nullable = false)
    private String snomedInter_auis;
    [...]
    @OneToMany(mappedBy="snomedInter")
        private Collection<TermProj> termProjs;
     
        public Collection<TermProj> getTermProjs() {
            return termProjs;
        }
     
        public void setTermProjs(Collection<TermProj> termProjs) {
            this.termProjs = termProjs;
        }
    [...]
    si vous remarquez j'ai mis:
    @Column(name = "AUIS", insertable = false, updatable = false, nullable = false) dans TermProjPK et @JoinColumn (name = "AUIS", insertable = false, updatable = false) dans TermProj; c'est parce que j'avais l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.MappingException: Repeated column in mapping for entity: ejb.entity.TermProj column: AUIS (should be mapped with insert="false" update="false")
    sachant que je ça repond pas vraiment à mes besoin puisque je veux quand même pouvoir inserer des elements et mettre à jour ma table !!
    mais je l'ai mis quand même pour voir s'il y a que ça !!


    cette fois j'ai l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.ejb.EJBException: javax.persistence.EntityNotFoundException: Unable to find ejb.entity.TermSource with id
    d'autres gens ont eu cette erreur avant moi, mais ils n'ont pas eu de reponse:

    http://forum.hibernate.org/viewtopic...2e97b24eea1741


    comme vous voyez, mon problème n'est toujours pas résolu !!

  19. #19
    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, c'était juste un problème d'intégrité dans la base de données, ils faut que la table d'association ne contient pas plus que les élements des deux autres tables.

    merci à tous et plus spécialement à Monsieur Cyril JOUI

  20. #20
    Candidat au Club
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Par défaut
    SVP Smix007 peut tu m'expliquer encore la solution car j'ai le même problème et je suis bloqué dans mon PFE je ne peux plus avancé
    et merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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