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 :

Problème d'héritage et de mapping


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut Problème d'héritage et de mapping
    Bonjour,

    j'ai posté il y a peu sur dvp, je commence à me dire que ce site devient indispensable ...

    J'ai un souci, je pense, avec mon mapping.

    Le hibernate.cfg.xml :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!DOCTYPE hibernate-configuration PUBLIC
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
    <hibernate-configuration>
      <session-factory>
        <mapping class="com.xxx.beans.Collab"/>
        <mapping class="com.xxx.beans.CollabDetailGene"/>
        <mapping class="com.xxx.beans.Service"/>
        <mapping class="com.xxx.beans.Societe"/>
      </session-factory>
    </hibernate-configuration>

    Ma classe CollabDetailGene extends ma classe Collab
    Je ne trouve pas d'exemples !
    Je spécifie ça comment dans mon cfg.xml ?

    Merci par avance.

    Edit... Finalement je ne suis pas sur que mon problème vienne de la...

    Je vais détailler un peu :
    J'ai une requête qui me remplit une List de Collab :

    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
    Criteria criteria = session.createCriteria(Collab.class)
    	.createAlias("soc", "s")
    	.createAlias("serv", "se")
    	.setFetchMode("soc", FetchMode.JOIN);
     
    if(!"".equals(nom))
    	criteria.add(Restrictions.like("nom", "%" + nom + "%"));
     
    if(!"".equals(societe))
    	criteria.add(Restrictions.like("s.lbsoc", "%" + societe + "%"));	
     
    if(!"".equals(service))
    	criteria.add(Restrictions.like("se.cserv", "%" + service + "%"));
     
    if(!"".equals(initof))
    	criteria.add(Restrictions.like("initof", "%" + initof + "%")); 
     
    if(!"".equals(local))
    	criteria.add(Restrictions.like("local", "%" + local + "%"));
     
    if(!"".equals(tel))
    	criteria.add(Restrictions.like("teleph", "%" + tel + "%"));
     
    if(!"".equals(badge))
    	criteria.add(Restrictions.like("cbadacc", "%" + badge + "%"));
     
    if(!"".equals(monet))
    	criteria.add(Restrictions.like("profilmon", "%" + monet + "%"));			
     
    collabs = criteria.addOrder(Order.desc("nom")).list();
    Cette requete fonctionne bien, enfin, du moins jusqu'à ce que je crée ma classe CollabDetailGene, qui extends Collab, comme je le disais.

    Maintenant j'ai un plantage sur cette requête apparemment :

    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
    44
    45
    46
    47
    48
    49
    GRAVE: "Servlet.service()" pour la servlet ControllerServlet a g�n�r� une exception
    org.hibernate.exception.SQLGrammarException: could not execute query
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    	at org.hibernate.loader.Loader.doList(Loader.java:2231)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
    	at org.hibernate.loader.Loader.list(Loader.java:2120)
    	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:118)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1596)
    	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
    	at com.xxx.dao.CollabDaoImpl.findCollabsBy(CollabDaoImpl.java:86)
    	at com.xxx.service.ServiceAccesDaoImpl.findCollabsBy(ServiceAccesDaoImpl.java:43)
    	at com.xxx.servlet.ControlServlet.doProcess(ControlServlet.java:133)
    	at com.xxx.servlet.ControlServlet.doPost(ControlServlet.java:74)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    	at java.lang.Thread.run(Thread.java:595)
    Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'DTYPE' : nom de colonne incorrect.
    	at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
    	at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    	at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown Source)
    	at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown Source)
    	at com.microsoft.jdbc.sqlserver.tds.TDSRPCRequest.processReplyToken(Unknown Source)
    	at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source)
    	at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source)
    	at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown Source)
    	at com.microsoft.jdbc.base.BaseStatement.postImplExecute(Unknown Source)
    	at com.microsoft.jdbc.base.BasePreparedStatement.postImplExecute(Unknown Source)
    	at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)
    	at com.microsoft.jdbc.base.BaseStatement.executeQueryInternal(Unknown Source)
    	at com.microsoft.jdbc.base.BasePreparedStatement.executeQuery(Unknown Source)
    	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
    	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    	at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:697)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    	at org.hibernate.loader.Loader.doList(Loader.java:2228)
    	... 23 more
    Alors que je n'ai fait que coder l'autre classe et quelques fonctions (qui n'exploitent pas Collab) !
    De plus le plantage se fait avant même que je n'exploite la nouvelle classe, à un endroit ou cela ne plantait pas avant !
    Et si je commente tout ce qui tourne autour de ma classe CollabDetailGene, ça remarche !
    Pourquoi ça me plante à la tronche ?
    Des idées ?

    Merci par avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut
    Bon première nouvelle, merci log4j !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: com.xxx.beans.CollabDetailGene
    Mais comment je mappe moi après :p
    Et, oui, mes deux beans utilisent la même table ds ma BDD, et j'espère bien que c'est possible !!!

    Bon, je continue ma recherche...

    (je poste au cas ou ça peut aider des gens)

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu dois "déclarer" l'héritage dans le fichier de mapping. Si tu as une table par classe, un truc du genre :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <class name="Collab" table="T_COLLAB">
        <id name="id" type="long" column="COLLAB_ID">
            <generator class="native"/>
        </id>
        ...
        <joined-subclass name="CollabDetailGene" table="T_COLLABDETAILGENE">
            <key column="COLLABDETAILGENE_ID"/>
            ...
        </joined-subclass>
    </class>
    Plus de détails dans la doc hibernate Mapping d'héritage de classe

    [edit] J'avais mal lu ton post , pour n'utiliser qu'une seule table c'est possible. Cf toujours la même doc Une table par hiérarchie de classe ^^.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut
    Merci Le y@m's,

    même à l'autre bout du monde, tu participes toujours autant !

    Je commence à regarder le tuto, interessant, j'avais deja vu tout ça mais je ne voyais pas bien comment l'utiliser...

    J'ai l'impression que je pourrais tout faire par annotations, et, vu que mon mapping est fait de cette façon, ça me brancherait bien...
    http://www2.lifl.fr/~dumoulin/enseig...nnotations.pdf
    Voir la partie 2.2.4 Mapper l'héritage.

    Mais si quelqu'un a d'autres pistes...

    Merci d'avance.

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Si tu utilises les annotations, il y a une doc dédiée Hibernate Annotations. Par contre la partie concernant l'héritage est quelque peu succinte :\
    Enfin, là je laisse la main aux experts hibernate ^^
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut
    Merci cher le y@m's, le pdf d'hier contenait ces infos aussi, mais j'ai encore du mal à voir l'utilité de @DiscriminatorColumn...

    Voila mon essai :
    La Classe Collab :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Entity
    @Table(name="COLLAB")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="???",discriminatorType=DiscriminatorType.STRING)
    @DiscriminatorValue("Collab")
    public class Collab implements  Serializable {
    ...
    }
    La classe CollabDetailGene :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Entity
    @DiscriminatorValue("CollabDetailGene")
    public class CollabDetailGene extends Collab implements Serializable {
    ...}
    Pour le DiscriminatorColumn, dans tous les exemples que j'ai vu, une colonne qui spécifie le type est utilisée pour différencier les instances produites...

    Mais moi la classe Collab m'est utile pour retourner un ensemble d'infos de la table COLLAB pour afficher dans une table html (liste de Collab), alors que la classe CollabDetailGene retourne des informations (en plus de celles de Collab) de cette même table COLLAB pour un Id collab donné...
    (En gros la classe CollabDetailGene que j'ai donne des infos supplémentaires par rapport à Collab, ce n'est pas à proprement dire une spécialisation de Collab, donc je n'ai pas de colonne qui permet de "typer" une instance...)

    J'espère que je me fais à peu près comprendre :p !

    Si vous avez des idées ou que vous pensez que, par exemple, je devrais n'utiliser qu'une classe pour tout ça (ce qui me semble lourd), faites le moi savoir, merci !

Discussions similaires

  1. problème constructeur + héritage
    Par BOLARD dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 08h11
  2. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  3. [AS2] Problème d'héritage
    Par wwave dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 27/01/2006, 09h26
  4. Problème d'héritage ?
    Par Romanops dans le forum WinDev
    Réponses: 2
    Dernier message: 16/11/2005, 17h18
  5. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17

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