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

Hibernate Java Discussion :

Jointure indirecte à travers plusieurs niveaux d'héritage


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut Jointure indirecte à travers plusieurs niveaux d'héritage
    Bonjour,
    Dans la BDD, j'ai la structure en héritage corespondant à ce MCD :
    Etudiant -(1,1)----Etre----0,1- Candidat -(1,1)----Etre----0,1- Utilisateur -(1,1)----Etre----0,1- Personne

    L'identifiant de la personne est aussi celui de l'utilisateur / candidat / étudiant.

    En SQL, je pourrais ainsi faire une jointure directe entre Etudiant et Personne. Mais dans le mapping généré par Seam Generate Entities, Etudiant n'est relié qu'à Candidat, qui lui même n'est relié qu'à Utilisateur, qui lui même n'est relié qu'à Personne.

    J'ai vu ailleurs qu'en HQL, join n'est pas accompagné de on puisqu'il semble que Hibernate se débrouille tout seul pour trouver les conditions de jointures.

    Comment alors puis-je faire une jointure directe entre Personne et Etudiant ?

    Voici la requête actuelle :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                Query query = entityManager.createQuery("from ThEtudiantEtu e "
                        + "join TePersonnePrs p "
                        + "where p.prsNom = :nom "
                        + "and p.prsPrenom = :prenom " 
                        + "and e.etuDateNaissance = :dateNaissance ");
    Elle donne cette erreur :
    javax.servlet.ServletException: #{identification.identifier}: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: Path expected for join! [from org.domain.stamas.entity.ThEtudiantEtu e join TePersonnePrs p where p.prsNom = :nom and p.prsPrenom = :prenom and e.etuDateNaissance = :dateNaissance ]
    Que me conseillez-vous ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu n'a pas besoin de jointure. Puisque Etudiant hérite de tout ça, tu utilise uniquement etudiant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                Query query = entityManager.createQuery("from ThEtudiantEtu e "
                        + "where e.prsNom = :nom "
                        + "and e.prsPrenom = :prenom " 
                        + "and e.etuDateNaissance = :dateNaissance ");

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Maintenant j'ai cette erreur :
    javax.servlet.ServletException: #{identification.identifier}: java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: prsNom of: org.domain.stamas.entity.ThEtudiantEtu [from org.domain.stamas.entity.ThEtudiantEtu e where e.prsNom = :nom and e.prsPrenom = :prenom and e.etuDateNaissance = :dateNaissance ]
    Apparemment, il ne suit pas le chemin jusqu'au bout !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu peux donner ton mapping et tes classes?

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Mapping généré automatiquement par Seam Generate Entities des JBoss Tools dans Eclipse.

    Dans ThEtudiantEtu.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
    /**
     * ThEtudiantEtu generated by hbm2java
     */
    @Entity
    @Table(name = "th_etudiant_etu")
    public class ThEtudiantEtu implements java.io.Serializable {
    // ...
        @GenericGenerator(name = "genEtudiant", strategy = "foreign", parameters = @Parameter(name = "property", value = "thCandidatCnd"))
        @Id
        @GeneratedValue(generator = "genEtudiant")
        @Column(name = "etu_id_candidat", unique = true, nullable = false)
        public int getEtuIdCandidat() {
            return this.etuIdCandidat;
        }
     
        public void setEtuIdCandidat(int etuIdCandidat) {
            this.etuIdCandidat = etuIdCandidat;
        }
    // ...
        @OneToOne(fetch = FetchType.LAZY)
        @PrimaryKeyJoinColumn
        @NotNull
        public ThCandidatCnd getThCandidatCnd() {
            return this.thCandidatCnd;
        }
     
        public void setThCandidatCnd(ThCandidatCnd thCandidatCnd) {
            this.thCandidatCnd = thCandidatCnd;
        }
    // ...
    Dans ThCandidatCnd :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    /**
     * ThCandidatCnd generated by hbm2java
     */
    @Entity
    @Table(name = "th_candidat_cnd")
    public class ThCandidatCnd implements java.io.Serializable {
    // ...
        public ThCandidatCnd(ThUtilisateurUti thUtilisateurUti) {
            this.thUtilisateurUti = thUtilisateurUti;
        }
    // ...
        @GenericGenerator(name = "genCandidat", strategy = "foreign", parameters = @Parameter(name = "property", value = "thUtilisateurUti"))
        @Id
        @GeneratedValue(generator = "genCandidat")
        @Column(name = "cnd_id_utilisateur", unique = true, nullable = false)
        public int getCndIdUtilisateur() {
            return this.cndIdUtilisateur;
        }
     
        public void setCndIdUtilisateur(int cndIdUtilisateur) {
            this.cndIdUtilisateur = cndIdUtilisateur;
        }
     
        @OneToOne(fetch = FetchType.LAZY)
        @PrimaryKeyJoinColumn
        @NotNull
        public ThUtilisateurUti getThUtilisateurUti() {
            return this.thUtilisateurUti;
        }
     
        public void setThUtilisateurUti(ThUtilisateurUti thUtilisateurUti) {
            this.thUtilisateurUti = thUtilisateurUti;
        }
    // ...
        @OneToOne(fetch = FetchType.LAZY, mappedBy = "thCandidatCnd")
        public ThEtudiantEtu getThEtudiantEtu() {
            return this.thEtudiantEtu;
        }
     
        public void setThEtudiantEtu(ThEtudiantEtu thEtudiantEtu) {
            this.thEtudiantEtu = thEtudiantEtu;
        }
    // ...
    Dans ThUtilisateurUti :
    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
    36
    37
    38
    39
    /**
     * ThUtilisateurUti generated by hbm2java
     */
    @Entity
    @Table(name = "th_utilisateur_uti")
    public class ThUtilisateurUti implements java.io.Serializable {
    // ...
        @GenericGenerator(name = "genUtilisateur", strategy = "foreign", parameters = @Parameter(name = "property", value = "tePersonnePrs"))
        @Id
        @GeneratedValue(generator = "genUtilisateur")
        @Column(name = "uti_id_personne", unique = true, nullable = false)
        public int getUtiIdPersonne() {
            return this.utiIdPersonne;
        }
     
        public void setUtiIdPersonne(int utiIdPersonne) {
            this.utiIdPersonne = utiIdPersonne;
        }
     
        @OneToOne(fetch = FetchType.LAZY)
        @PrimaryKeyJoinColumn
        @NotNull
        public TePersonnePrs getTePersonnePrs() {
            return this.tePersonnePrs;
        }
     
        public void setTePersonnePrs(TePersonnePrs tePersonnePrs) {
            this.tePersonnePrs = tePersonnePrs;
        }
    // ...
        @OneToOne(fetch = FetchType.LAZY, mappedBy = "thUtilisateurUti")
        public ThCandidatCnd getThCandidatCnd() {
            return this.thCandidatCnd;
        }
     
        public void setThCandidatCnd(ThCandidatCnd thCandidatCnd) {
            this.thCandidatCnd = thCandidatCnd;
        }
    // ...
    Dans TePersonnePrs :
    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
    /**
     * TePersonnePrs generated by hbm2java
     */
    @Entity
    @Table(name = "te_personne_prs")
    public class TePersonnePrs implements java.io.Serializable {
    // ...
        @Id
        @GeneratedValue(strategy = IDENTITY)
        @Column(name = "prs_id", unique = true, nullable = false)
        public Integer getPrsId() {
            return this.prsId;
        }
     
        public void setPrsId(Integer prsId) {
            this.prsId = prsId;
        }
    // ...
        @OneToOne(fetch = FetchType.LAZY, mappedBy = "tePersonnePrs")
        public ThUtilisateurUti getThUtilisateurUti() {
            return this.thUtilisateurUti;
        }
    // ...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ha oui, mais il y a pas l'héritage que tu mentionnait dans le premier post là!! Faut savoir, tu veux un héritage ou pas d'héritage? Par ce que là, t'as juste un paquet de classes en relation 1-1, ce qui est pas la même chose!

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

Discussions similaires

  1. Héritage sur plusieurs niveaux de user control
    Par lila23 dans le forum Silverlight
    Réponses: 6
    Dernier message: 14/09/2011, 15h18
  2. Réponses: 0
    Dernier message: 28/11/2009, 18h18
  3. [Framework] AOP - Héritage à plusieurs niveaux
    Par teletexte dans le forum Spring
    Réponses: 0
    Dernier message: 18/02/2009, 17h02
  4. Réponses: 10
    Dernier message: 25/01/2008, 16h24
  5. [Hibernate] Héritage sur plusieurs niveaux
    Par srvremi dans le forum Hibernate
    Réponses: 2
    Dernier message: 31/05/2006, 18h39

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