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 :

[Hibernate3] Anomalies dans le SQL généré


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut [Hibernate3] Anomalies dans le SQL généré
    voila en jetant un coup d'oeil dans les logs, je mes uis apercu qu'Hibernate génere des requetes sql inutiles et incohérente:
    g le schéma suivant:
    Caracteristique * -------- Carac_Produit --------- * Produit
    numC . valeur . numP
    libelle

    carac_produit est mappé en élément composite pour un Set (donc pas de requete hql possible)
    une partie du mapping
    <hibernate-mapping>

    <class name="dao.Produit" table="PRODUIT">

    <id name="numProduit" type="int" unsaved-value="null" >
    <column name="numProduit" sql-type="int(11)" not-null="true"/>
    <generator class="increment" />
    </id>

    ...

    <set name="listCaract" table="CARAC_PRODUIT" lazy="true">
    <key column="numP"/>
    <composite-element class="dao.CaracProduit">
    <property name="valeur" column="valeur" />
    <many-to-one name="carac" column="numCarac" />
    </composite-element>
    </set>

    </class>

    </hibernate-mapping>

    pour récupérer les caractéristiques d'un produit + les valeurs associées g la fonction suivante:

    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 Set<CaracProduit> getCaractProduitById(int idProduit ) throws Exception {
            Session session = this.getSession();
            Transaction tx = session.beginTransaction();
     
            Produit p = (Produit) session.load(Produit.class, idProduit);
            Set<CaracProduit> lst = p.getListCaract();
            for (CaracProduit car: lst){
                Hibernate.initialize(car.getCarac());
            }
            tx.commit();
            session.flush();
            return lst;
        }
    je récupere un produit puis je récupere la liste des carac_produits (valeurs) puis je charge les éléments caractéristiques (a cause du lazy loading)


    Voici la requete générée
    Hibernate: select produit0_.numProduit as numProduit0_, produit0_.libelleP as libelleP7_0_, produit0_.designationP as designat3_7_0_, produit0_.refFourProduit as refFourP4_7_0_, produit0_.prixP as prixP7_0_, produit0_.stockP as stockP7_0_, produit0_.nbConsultation as nbConsul7_7_0_, produit0_.promo as promo7_0_, produit0_.etatP as etatP7_0_, produit0_.refCategorie as refCate10_7_0_, produit0_.refConstructeur as refCons11_7_0_ from PRODUIT produit0_ where produit0_.numProduit=?

    Hibernate: select listcaract0_.numP as numP0_, listcaract0_.valeur as valeur0_, listcaract0_.numCarac as numCarac0_ from CARAC_PRODUIT listcaract0_ where listcaract0_.numP=?

    Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
    Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
    Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
    Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
    Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
    Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
    Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
    et la suite est plus génante:
    Hibernate: delete from CARAC_PRODUIT where numP=? and valeur=? and numCarac=?
    Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
    Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
    Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
    Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
    Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
    Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
    Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
    pourquoi ce delete et les insert?????

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 70
    Par défaut
    Je te dirai que c'est peut être de requête paramétrables qu'il affiche mais n'execute pas. Ceci dit c'est juste une supposition.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 67
    Par défaut
    SAlut,
    je te conseille d'aller faire un tour sur le site d'hibernate.
    Il y a un forum et un tas de documentation.
    Ton problème y a deja été evoqué.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    dsolé g pas trouvé mon pb

    m g posté sur le forum officiel

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    g confirmation de ce que tu dis:
    http://forum.hibernate.org/viewtopic.php?t=931758&highlight=equals+hashcode+compositeelement

    par contre, je n'arrive pas a implémenter hashcode dans carac_produit
    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
     
        public boolean equals(Object other){
            if (other == this ) return true;
            if ( !(other instanceof CaracProduit) ) return false;
     
            final CaracProduit cp = (CaracProduit) other;
            if ( !cp.getProduit().equals(getProduit()) ) return false;
            if ( !cp.getCarac().equals(getCarac()) ) return false;
     
            return true;
        }
     
        public int hashCode(){
            //return getProduit().hashCode() * 29 + getCarac().hashCode() * 57 ;
            return getProduit().getNumProduit() * 29 + getCarac().getNumCarac() * 57 ;
        }
    il me retoune null (sans erreurs), alors qu'il a au moins chargé les produits (je pense)

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 67
    Par défaut
    essaye plutôt ça pour ta méthode hashcode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public int hashCode() {
    int result=0;
    if(getProduit()!=null && getProduit().getNumProduit() !=null ){
    result = getProduit().getNumProduit() .hashCode();
    }
    if(getCarac()!=null && getCarac().getNumCarac()!=null){
    result = 29 * result + getCarac().getNumCarac().hashCode();
    }
    return result;
    }

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    quand je fais getProduit dans le hashcode il vaut null !!!???
    par contre le getCaracteristique est non null.

    c incompréhensible car auparavant, pour obtenir cette liste de carac_produit, j'y accede a partir d'un produit que j'ai chargé:

    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
     
    public Set<CaracProduit> getCaractProduitById(int idProduit ) throws Exception {
     
            Session session = HibernateUtil.currentSession();
            //Session session = this.getSession();
            Transaction tx = session.beginTransaction();
            Set<CaracProduit> lst = null;
            try{
            Produit p = (Produit) session.load(Produit.class, idProduit);
            Hibernate.initialize(p.getListCaract() );
            lst = p.getListCaract();
            for (CaracProduit car: p.getListCaract()){
                System.out.println(car.getProduit() + "  " + car.getCarac() );
                // getProduit() retourne null, de meme dans la fonction de hashcode
     
            }
     
     
            tx.commit();
            }catch(Exception e){
                System.out.println("eeeee " + e.getMessage() );
                tx.rollback();
            }
            finally{
                //session.flush();
                HibernateUtil.closeSession();
     
            }
            return lst;
        }

    et voici le mapping de la liste de carac_produit dans un produit:

    <set name="listCaract" table="CARAC_PRODUIT" lazy="true">
    <key column="numP"/>
    <composite-element class="dao.CaracProduit">
    <property name="valeur" column="valeur" />
    <many-to-one class="dao.Caracteristique" name="carac" column="numCarac" />
    </composite-element>
    </set>
    je comprends plus rien!
    sinon, si je ne surcharge pas ma fonction de hash, ca marche nickel!

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

Discussions similaires

  1. [BI4] Filtre non visible dans sql généré
    Par nabou dans le forum Launchpad (ex-Infoview)
    Réponses: 1
    Dernier message: 13/05/2013, 13h47
  2. Code PL/SQL généré dans OWB
    Par yasstunisien dans le forum PL/SQL
    Réponses: 3
    Dernier message: 04/11/2011, 17h33
  3. Réponses: 6
    Dernier message: 04/06/2008, 13h27
  4. uniqueidentifier et INSERT dans MS-SQL
    Par Dlfine dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 12/08/2004, 11h29

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