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 :

OneToMany sur une hiérarchie de classe


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Points : 35
    Points
    35
    Par défaut OneToMany sur une hiérarchie de classe
    Bonjour,

    voila mon pb :
    j'ai une classe gabarit qui possède une relation OneToMany avec une Classe GabaritElement ( qui a 2 classes enfants ) GabaritNote et GabaritCumul. La classe gabarit contient une un Set d'objet GabaritElement et/ou GabaritNote et/ou GabaritCumul.
    Je suis un peu nul en java donc c'estpeut être un pb avec mais generic ou ...
    voila mon code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Entity
    public class Gabarit extends BaseObject {
    	...
    	private Set<GabaritElement> elements = new HashSet<GabaritElement>();
     
    	@OneToMany
        @JoinColumn(name="GABARIT_ID")
        public Set<GabaritElement> getElements() {
            return elements;
        }
    	...
    }
    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
     
    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(
        name="ELEMENT_TYPE",
        discriminatorType=DiscriminatorType.STRING
    )
    @DiscriminatorValue("Element")
    public class GabaritElement extends BaseObject {
     
        private Gabarit gabarit = null;
     
        @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
        @JoinColumn(name="ELEMENT_ID")
        public Element getElement() {
            return element;
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	@Entity
    	@DiscriminatorValue("Cumul")
    	public class GabaritCumul extends GabaritElement {
    		...
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	@Entity
    	@DiscriminatorValue("Note")
    	public class GabaritNote extends GabaritElement {
    		...
    	}

    Mon erreur :

    org.hibernate.WrongClassException: Object with id: 1 was not of the specified subclass: model.GabaritElement (Discriminator: note)
    at org.hibernate.loader.Loader.getInstanceClass(Loader.java:1444)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1275)
    at org.hibernate.loader.Loader.getRow(Loader.java:1197)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568)
    at org.hibernate.loader.Loader.doQuery(Loader.java:689)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.loadCollection(Loader.java:1985)
    at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
    at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
    at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
    at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:163)
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:329)
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:205)
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:137)
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:271)
    at org.apache.jsp.WEB_002dINF.pages.gabaritconfig_jsp._jspx_meth_c_forEach_2(org.apache.jsp.WEB_002dINF.pages.gabaritconfig_jsp:456)
    at org.apache.jsp.WEB_002dINF.pages.gabaritconfig_jsp._jspService(org.apache.jsp.WEB_002dINF.pages.gabaritconfig_jsp:156)
    ...


    Si vous avez une solution.
    Merci. Julien C.

  2. #2
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Ceci ne va pas complètement résoudre ton pb, mais clarifier un peu tes relations :
    Tu as une relation 1-n entre gabarit et element, et tu veux une ralation bi-directionnelle, à savoir le gabarit connaît ses elements (1-n), et chaque élément connaît le gabarit auquel il appartient (n-1).
    Pour cela, c'est la table des éléments qui va porter la relation en base.

    1) Pour que le code soit explicite, ajoute le nom de la table lors du mapping :
    pour gabarit : pour element :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Table(name="GABARIT_ELEMENT")

    2) Ensuite, comme c'est la table GABARIT_ELEMENT qui porte la relation, indique le dans ta relation element vers gabarit. Dans Element :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        @ManyToOne(cascade = {CascadeType.ALL}) // a adapter suivant tes besoins
        @JoinColumn(name="GABARIT_ID")
        private Gabarit gabarit = null;

    3- Ensuite, dans la classe Gabarit, tu dis que la relation est portée par l'attribut Element.gabarit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        @OneToMany(mappedBy="gabarit")
        private Set<GabaritElement> elements = new HashSet<GabaritElement>();
    çà devrait aller déjà un peu mieux...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    merci pour ta réponse.

    En fait ca ne répond pas trop à ma question mais par contre ca m'éclaircie la relation OneToMany et Hibernate que je ne maitrise pas encore trés bien. En fait je suis arrivé à corriger mon erreur en essayant d'appliquer ta solution. j'ai fait une erreur d'étourderie (pas la dernière je crois) . Dans mon jeu de test j'avais inséré dans le colonne ELEMENT_TYPE (ma colonne driscriminante) une valeur ne correpondant à aucune classe fille. "note" au lieu de "Note"...

    En tout cas merci.
    Julien.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/04/2008, 17h25
  2. Select sur une hiérarchie.
    Par JeanMichel CROQUETTE dans le forum Schéma
    Réponses: 2
    Dernier message: 14/01/2008, 15h05
  3. @OneToMany sur une Map<Product,Integer>
    Par ®om dans le forum JPA
    Réponses: 5
    Dernier message: 25/02/2007, 19h13
  4. Réponses: 2
    Dernier message: 11/09/2006, 12h22
  5. Réponses: 2
    Dernier message: 25/08/2006, 22h18

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