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 :

Probleme passer en revue tout les id d'une table [HQL]


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Probleme passer en revue tout les id d'une table
    Bonjour a tous,

    Pour commencer je suis débutent sur l'utilisation d'hibernate, mon probleme ce situe dans une methode que j'ai crée pour ajouter des clients a mon programme.

    je vous soumet le code
    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
       public void AjouterClient() {
            s = helper.getSessionFactory().openSession();
            s.beginTransaction();
            cl = (Client) s.get(Client.class, 1);
            co = (Commune) s.get(Commune.class, cl.getCommune().getCommuneId());
            String com = co.getCommuneNom();
            String cp = co.getCommuneCp();
            s.getTransaction().commit();
            s.close();
     
     
            if (com.compareTo(ac.jTextFieldAjoutComClient.getText()) == 0) {
                if (cp.compareTo(ac.jTextFieldAjoutCpClient.getText()) == 0) {
                    co = new Commune(co.getCommuneNom(), co.getCommuneCp());
                    cl = new Client(co, ac.jTextFieldAjoutNomClient.getText(),
                            ac.jTextFieldAjoutAdrClient.getText(),
                            Integer.parseInt(ac.jTextFieldAjoutNumClient.getText()),
                            ac.jTextFieldAjoutTelClient.getText(),
                            ac.jTextFieldAjoutEmailClient.getText());
                    s = helper.getSessionFactory().openSession();
                    s.beginTransaction();
                    s.update(co);
                    s.save(cl);
                    s.getTransaction().commit();
                    s.close();
                }
            } else {
                co = new Commune(ac.jTextFieldAjoutComClient.getText(), ac.jTextFieldAjoutCpClient.getText());
                cl = new Client(co, ac.jTextFieldAjoutNomClient.getText(),
                        ac.jTextFieldAjoutAdrClient.getText(),
                        Integer.parseInt(ac.jTextFieldAjoutNumClient.getText()),
                        ac.jTextFieldAjoutTelClient.getText(),
                        ac.jTextFieldAjoutEmailClient.getText());
                s = helper.getSessionFactory().openSession();
                s.beginTransaction();
                s.save(co);
                s.save(cl);
                s.getTransaction().commit();
                s.close();
            }
        }
    Donc dans ma DB sql j'ai deux table distincte "Client" et "Commune" commune contient le nom de la commune et le code postal et l'id des communes bien sur.

    Dans ma méthode je rajoute un client et je vérifie si la commune existe déjà pour ne pas avoir de doublon, mais voila ici sans taper de query sql je ne vois pas bien comment vérifier si une commune existe déjà.

    Mon probleme doit venir du debut de ma methode ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            s = helper.getSessionFactory().openSession();
            s.beginTransaction();
            cl = (Client) s.get(Client.class, 1);
            co = (Commune) s.get(Commune.class, cl.getCommune().getCommuneId());
            String com = co.getCommuneNom();
            String cp = co.getCommuneCp();
            s.getTransaction().commit();
            s.close();
    Je passe en revue l'ID client n°1 mais je ne vois pas comment faire une boucle pour tous les vérifier, j'ai honte de bloquer sur une betisse comme celle ci ...

  2. #2
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Déjà, il y a 3 transactions dans ton code, pour un seul ajout, ça n'a pas de sens.

    Ensuite, ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            s = helper.getSessionFactory().openSession();
            s.beginTransaction();
            cl = (Client) s.get(Client.class, 1);
            co = (Commune) s.get(Commune.class, cl.getCommune().getCommuneId());
            String com = co.getCommuneNom();
            String cp = co.getCommuneCp();
            s.getTransaction().commit();
            s.close();
    n'a absolument pas besoin de faire un commit de transaction. En plus, tout ce que ça fait c'est récupérer le nom et le code postale de la commune du premier client. Quel intérêt??

    Tu veux vérifier si une commune existe déjà dans ta db?
    Tu fais ceci tout simplement. Je te laisse gérer correctement les exceptions et les rollback

    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
    session=.....
    try{
      transaction = session.beginTransaction();
      try{
        Commune commune = (Commune)session.createQuery("from Commune where communeNom =:nom and communeCp=:code")
              .setParameter("nom",nomDeCommune)
              .setParameter("code",codePostal)
              .uniqueResult();
        if (commune==null){
          commune = new Commune(nomDeCommune,codePostal);
          session.save(commune);      
        }
        Client c = new Client(.....);
        c.setCommune(commune);
        session.save(c);
      } finally {
        transaction.commit();
      }
    } finally {
      session.close();
    }
    Remarque importante: c'est une très mauvaise pratique de répéter le nom de la classe dans ses méthode. Genre getCommuneCP n'a aucun sens sur une classe "Commune". Appelle directement ta méthode getCP ou getCodePostal, on sait bien que c'est celui d'une commune vu le nom de la classe. Pareil pour commune.getCommuneNom() -> commune.getNom()

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    j'ai essayer ton implémentation mais j'ai une erreur

    Exception in thread "AWT-EventQueue-0" org.hibernate.hql.ast.QuerySyntaxException: commune is not mapped [from commune where commune_nom =:nom and commune_cp=:code]

    Je l'ai eu quelque fois mais je ne la comprend pas.

    Mais il faudra quand même que je sache vérifier si la commune existe, parce que ajouter je sais le faire mais ne pas avoir de doublon dans mes commune c'est la que je n'arrive plus...

  4. #4
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Il te dit que Commune n'est pas une classe géré par hibernate. Vérifie dans ta configuration que tu n'a pas oublié Commune dans ton mapping.

    normalement, en priorité, c'est à ta base de donnée à empêcher les doublons. Il faut créer un contrainte d'unicité sur la paire codepostale,nom dans ta table des communes.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Comment je peux le verifier desoler mais je debarque vraiment dedans pourtant commune je l'ai dans mes entite j'ai un xml qui porte le meme nom.

    Je vais regarder a ce que tu me raconte pour les doublons, je devrais le mettre dans mon script sql alors.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    J'ai mis la contraite d'unicité donc maintenant je n'ai plus besoins de gerer cette exception sur le code, le code que tu m'as donner devrait aller sans probleme, mais j'ai toujours cette erreur je ne comprends pas :s

  7. #7
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    peux-tu envoyer les classes Commune, et Client?
    ainsi que ton fichier de mapping si tu ne passes pas par les annotations.
    Eric

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 19 juil. 2012 16:20:50 by Hibernate Tools 3.2.1.GA -->
    <hibernate-mapping>
        <class name="entite.Commune" table="commune" catalog="gestion">
            <id name="communeId" type="java.lang.Integer">
                <column name="Commune_ID" />
                <generator class="identity" />
            </id>
            <property name="communeNom" type="string">
                <column name="Commune_Nom" length="45" not-null="true" />
            </property>
            <property name="communeCp" type="string">
                <column name="Commune_Cp" length="45" not-null="true" />
            </property>
            <set name="fournisseurs" inverse="true">
                <key>
                    <column name="Commune_ID" not-null="true" />
                </key>
                <one-to-many class="entite.Fournisseur" />
            </set>
            <set name="clients" inverse="true">
                <key>
                    <column name="Commune_ID" not-null="true" />
                </key>
                <one-to-many class="entite.Client" />
            </set>
        </class>
    </hibernate-mapping>
    la table commune a bien ete mapper pourtant

  9. #9
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" org.hibernate.hql.ast.QuerySyntaxException: commune is not mapped [from commune where commune_nom =:nom and commune_cp=:code]
    tu as ecrit chez toi commune et non Commune. regardes cela voir.
    Eric

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Ah je pensais que en hql la syntaxe des majuscules ne comptais pas, mais bon maintenant j'ai un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    je vais finir par m’en sortir lol

    voila comment j'ai remanier ta methode

    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
            s = helper.getSessionFactory().openSession();;
            try {
                s.beginTransaction();
                try {
                    Commune commune = (Commune) s.createQuery("from Commune where Commune_Nom =:nom and Commune_Cp=:code")
                            .setParameter("nom", co.getCommuneNom())
                            .setParameter("code", co.getCommuneCp())
                            .uniqueResult();
                    if (commune == null) {
                        co = new Commune(co.getCommuneNom(), co.getCommuneCp());
                        s.save(commune);
                    }
                    cl = new Client(co, ac.jTextFieldAjoutNomClient.getText(),
                            ac.jTextFieldAjoutAdrClient.getText(),
                            Integer.parseInt(ac.jTextFieldAjoutNumClient.getText()),
                            ac.jTextFieldAjoutTelClient.getText(),
                            ac.jTextFieldAjoutEmailClient.getText());
                    cl.setCommune(commune);
                    s.save(co);
                } finally {
                    s.getTransaction().commit();
                }
            } finally {
                s.close();
            }
        }

  11. #11
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    pas du tout car il cherche la mapping-classe commune et ne la trouve pas.

  12. #12
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    dans ton fichier de mapping tu dis que toute les valeurs doivent etre not null, as tu verifié? car s´il ya une valeur qui est null, alors client sera null.
    Verifie ceci voir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if( cl == nulll)
       System.out.println("le client est null");
    else
    {
       cl....;
    }

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Resolut !!!

    Vraiment merci a vous, vous m'avez été d'une grande aide j'ai pu ouvrir les yeux par moi même sur vos éclaircissement

    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
            s = helper.getSessionFactory().openSession();;
            try {
                s.beginTransaction();
                try {
                    String nomCommune = ac.jTextFieldAjoutComClient.getText();
                    String cpCommune = ac.jTextFieldAjoutCpClient.getText();
                    Commune commune = (Commune) s.createQuery("from Commune where Commune_Nom =:nom and Commune_Cp=:code")
                            .setParameter("nom", nomCommune)
                            .setParameter("code", cpCommune)
                            .uniqueResult();
                    if (commune == null) {
                        commune = new Commune(nomCommune, cpCommune);
                        s.save(commune);
                    }
                    Client client = new Client(co, ac.jTextFieldAjoutNomClient.getText(),
                            ac.jTextFieldAjoutAdrClient.getText(),
                            Integer.parseInt(ac.jTextFieldAjoutNumClient.getText()),
                            ac.jTextFieldAjoutTelClient.getText(),
                            ac.jTextFieldAjoutEmailClient.getText());
                    client.setCommune(commune);
                    s.save(commune);
                    s.save(client);
                } finally {
                    s.getTransaction().commit();
                }
            } finally {
                s.close();
            }
        }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/03/2014, 11h58
  2. Utilisation de Tout les champs d'une table
    Par MeRc|LeSs dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/07/2006, 20h55
  3. Réponses: 7
    Dernier message: 30/05/2006, 11h00
  4. Probleme de requete pour remplir les champs d'une table
    Par Jim_Nastiq dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/04/2006, 14h56
  5. Réponses: 4
    Dernier message: 11/10/2005, 15h03

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