[Hibernate] Erreur de mapping

Erreur de mapping [Hibernate] - Java - Programmation

Marsh Posté le 16-11-2005 à 19:53:25    

Salut,      
 
    J'ai :
 
Une classe abstraite Article et une classe Stylo.
 
J'arrive a mettre des stylos dans ma base sans problemes :
 

Code :
  1. /* ... */
  2. Stylo s1 = new Stylo("s12", "Eine stylo bleuen", "Dushmoll", 12,"bleu" );
  3. m.saveStylo(s1);
  4. /* ... */
  5. public void saveStylo(Stylo s) throws HibernateException{
  6.     Session session = HibernateUtil.currentSession();
  7.     Transaction tx = session.beginTransaction();   
  8.    
  9.        session.save(s);     
  10.     tx.commit();
  11.     HibernateUtil.closeSession();   
  12. }


 
Mais j'ai une "org.hibernate.hql.ast.QuerySyntaxException: article is not mapped." quand j'essaye de
récuperer un stylo de la base :
 

Code :
  1. public void test()throws HibernateException{
  2.     Session session = HibernateUtil.currentSession();
  3.     Transaction tx = session.beginTransaction();           
  4.    
  5.     Query query = session.createQuery("select reference from article where reference = :ref" );
  6.     query.setString("ref", "s12" );
  7.     for (Iterator it = query.iterate(); it.hasNext();) {
  8.     Stylo stylo = (Stylo) it.next();
  9.     System.out.println(" : " + stylo.getDescriptif());
  10.     }   
  11.    
  12.     tx.commit();
  13.     HibernateUtil.closeSession();   
  14.     }


 
Je trouve paradoxal le fait qu'il sauvegarde sans souci et au chargement il me sort que article n'est pas mappé  : :heink:  
 
Voila le Article.hbm.xml :

Code :
  1. <hibernate-mapping>
  2.     <class name="fr.unice.toto.article.Article" table="article">
  3.         <!-- Primary Key : reference est une String ?????? -->
  4. <id name="reference" column="reference" type="java.lang.String">
  5.             <!-- Pour l'instant on met pas ... verra apres -->
  6.             <!-- <generator class="increment"/> -->
  7.         </id>
  8.         <!-- Pour differencier nos objets dans la table -->
  9.         <discriminator column="type_article" type="string"/>       
  10.         <!-- Les sous classes de Article -->
  11.        
  12.         <!-- La sous classe abstraite ArticleUnitaire -->               
  13.         <subclass name="fr.unice.toto.article.ArticleUnitaire">       
  14.          <property name="marque" column="marque"/>
  15.          <property name="pu" column="pu"/>       
  16.          <property name="descriptif" column="descriptif"/>       
  17.             <!-- La sous classe concrete Stylo -->
  18.             <subclass name="fr.unice.toto.article.Stylo">
  19.                 <property name="couleur" column="couleur"/>
  20.             </subclass>
  21.             <!-- La sous classe concrete Ramette -->
  22.             <subclass name="fr.unice.toto.article.Ramette">
  23.                 <property name="grammage" column="grammage"/>
  24.             </subclass>
  25.         </subclass>
  26.         <!-- La sous classe concrete Lot -->
  27.         <subclass name="fr.unice.toto.article.Lot">
  28.          <property name="nb" column="nb"/>
  29.          <property name="pourcentage" column="pourcentage"/>
  30.         </subclass>
  31.     </class>
  32. </hibernate-mapping>


 
Une idée svp ?


Message édité par Chronoklazm le 16-11-2005 à 19:58:22
Reply

Marsh Posté le 16-11-2005 à 19:53:25   

Reply

Marsh Posté le 16-11-2005 à 20:06:44    

peut etre rien à voir mais pourquoi tu fais de l'hql pour des requetes comme ça au lieu d'utiliser le chouette package de query ? :/
 
(j'allais te suggerer de faire une requete avec, juste pour voir, par curiosité, des fois que ta requete serait mal foutue)
 
(et revise moi ton indentation sur ton xml, c'est du n'importe quoi :o)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:06:54    

et avec une query plus dans le style hibernate du genre  : "from Article where reference = :ref"  (avec un grand A pour article), ca donne quoi ?

Reply

Marsh Posté le 16-11-2005 à 20:07:44    

from fr.unice.toto.article.Article, meme, non , d'ailleurs ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:08:08    

Bon dsl je suis trop nase !
c'est ma requete qui pue  

Code :
  1. Query query = session.createQuery("select a from Article as a where a.reference = 's12'" );
  2.     for (Iterator it = query.iterate(); it.hasNext();) {
  3.     Stylo stylo = (Stylo) it.next();
  4.     System.out.println(" : " + stylo.getDescriptif());
  5.     }

Reply

Marsh Posté le 16-11-2005 à 20:08:38    

ah ouais il a pas déclaré son package en début de son hbm

Reply

Marsh Posté le 16-11-2005 à 20:10:43    

tiens au fait, avec ce style de mapping, ta table elle ressemble à quoi ? plein de colonnes (in)utilisées en fonction du type ?  
 
et il stocke le type ou ?-->        <discriminator column="type_article" type="string"/>          :D
 
il y stocke quoi ? l'attribut type peut prendre quoi comme autres valeurs ??

Message cité 1 fois
Message édité par the real moins moins le 16-11-2005 à 20:11:45

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:12:09    

the real moins moins a écrit :

from fr.unice.toto.article.Article, meme, non , d'ailleurs ?


 
 :jap:  
 
Et pour l'indentation ... ça me soule NetBeans ne la fait pas automatiquement le vilain chenapan.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 16-11-2005 à 20:13:14    

si tu mets juste Article, ça marche aussi, meme sans declarer de package ? Par chance, ou parce qu'hibernate voit qu'il ne connait qu'une classe dont le short name est Article ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:15:19    

(n'empeche, je vote pour une query dans le style de

Criteria criteria = session.createCriteria(Article.class);
criteria.add(Expression.eq("ref", "s12" ).ignoreCase());
Stylo stylo = (Stylo) criteria.uniqueResult();


splu joli :D
(tu peux ptet meme faire createCriteria(Stylo.class)pour etre plus safe, au besoin)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:15:19   

Reply

Marsh Posté le 16-11-2005 à 20:16:58    

the real moins moins a écrit :

tiens au fait, avec ce style de mapping, ta table elle ressemble à quoi ? plein de colonnes (in)utilisées en fonction du type ?  
 
et il stocke le type ou ?-->        <discriminator column="type_article" type="string"/>          :D
 
il y stocke quoi ? l'attribut type peut prendre quoi comme autres valeurs ??


 
 
Bein c'est la strategie la moins prise de tête et celle ou l'on fait le moins de jointure ... bref la meilleure non ?
 
Et j'ai une colonne type_article pour diferencier les articles, c'est quoi le souci ?
 


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 16-11-2005 à 20:19:09    

ha mais y'a pas de souci, je demande, stoo ;)
j'ai jamais fait grand chose de super excitant avec hibernate, et notamment les mappings de sous-classes, jamais touché :)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:20:03    

theReal-- : Oui avec juste Article ça marche aussi. Pourquoi je sais pas ... ta theorie à l'air pas mal.
 
sebi : "ah ouais il a pas déclaré son package en début de son hbm"
 
En le mettant dans l'attribut name du tag "class", ça suffit pas ?

Message cité 1 fois
Message édité par Chronoklazm le 16-11-2005 à 20:21:42

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 16-11-2005 à 20:25:24    

the real moins moins a écrit :

ha mais y'a pas de souci, je demande, stoo ;)
j'ai jamais fait grand chose de super excitant avec hibernate, et notamment les mappings de sous-classes, jamais touché :)


 
Y a trois possibilités :
 - 1 seule table pour toute la hierarchie d'heritage
 - 1 table par classe
 - 1 table par classe concrete  
 
La derniere est la plus intuitive mais la plus casse-guele aussi  :sarcastic:  
Et carrement méchante à mapper.
 
EDIT :  Et ce qui est bien pour la premiere strategie c'est qu'on est reduit à faire 1 seul hbm pour toute la hierarchie
et donc pas se tapper les fichiers de mapping pour chaque sous-classe.


Message édité par Chronoklazm le 16-11-2005 à 20:29:13

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 16-11-2005 à 20:27:46    

et donc, tu m'as pas dit, dans type_article, hibernate stocke quoi ? :D
(et pourquoi sur <discrimator> y'a un attribut type? quel autre valeur que string sont possibles??)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:28:03    

(en meme temps, je pourrais aller lire la doc hein [:gilbert gosseyn])


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:31:23    

le class.getName() je crois


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 16-11-2005 à 20:32:13    

Chronoklazm a écrit :


 
sebi : "ah ouais il a pas déclaré son package en début de son hbm"
 
En le mettant dans l'attribut name du tag "class", ça suffit pas ?


 
 
<hibernate-mapping package="fr.unice.toto.article" >
comme ca tu as plus besoin de préfixer les autres classes à l'intérieur de ton mapping.

Reply

Marsh Posté le 16-11-2005 à 20:32:49    

Ouais voila ...
 
Dans la BD ca donne :
 
type_article(varchar)  
fr.unice.toto.article.Stylo


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 16-11-2005 à 20:33:03    

ok merci :)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2005 à 20:33:53    

sebi a écrit :

<hibernate-mapping package="fr.unice.toto.article" >
comme ca tu as plus besoin de préfixer les autres classes à l'intérieur de ton mapping.


 
dakhor  :jap:


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed