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 :

[Hibernate] exception WrongClassException héritage subclass


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut [Hibernate] exception WrongClassException héritage subclass
    Bonjour, voila je tombe sur une exceptio lorsque je réupère des données de la base.
    En fait je sauvegarde la classe workspace qui contient une liste de Sensor.
    Le sensor peuvent etre de plusieurs, type, voici le fichier XML de sensor :
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="dsi.emc.pac7000.core.sensor">
     
            <class name="Sensor" table="SENSOR" discriminator-value="S">
                    <id name="id" column="sensor_uid" type="long" unsaved-value="0">
                            <generator class="identity"/>
                    </id>
                    <discriminator column="SENSOR_TYPE" type="string"/>
     
                    <property  name="name" column="NAME" type="string"/>
     
                    <subclass name = "dsi.emc.pac7000.core.sensor.demo.DemoSensor" discriminator-value="DEMOSENSOR">
     	</subclass>
     
    	<subclass name = "dsi.emc.pac7000.core.sensor.manual.ManualSensor" discriminator-value="MANUALSENSOR">
     	</subclass>
     
    	<subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.AbstractGage" discriminator-value="ABSTRACTGAGE">
    	      <property name="nbMinValue" column="NB_MIN" type="int"/>
     
    	      <subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.DigitalGage" discriminator-value="DIGITALGAGE">
    	      </subclass>
    	      <subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.AnalogGage" discriminator-value="ANALOGGAGE">
    	      </subclass>
    	      <subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.Rs232Gage" discriminator-value="RS232GAGE">
    	           <property  name="initialisation" column="INIT"	type="string"/>
    	           <property  name="field" column="FIELD" type="int"/>
    	           <bag  name="buffers" inverse="false" cascade="all-delete-orphan">
    	               <key column="buffer_uid"/>
    	               <one-to-many class="dsi.emc.pac7000.core.sensor.gagetalker.Rs232GageBuffer"/>
    	          </bag>	  
    	         <property  name="buffer" 			column="BUFFER"	type="string"/>
    	     </subclass>
    	</subclass>
            </class>
    </hibernate-mapping>
    voici l'extrait du fichier de mapping XML de la table WORKSPACE
    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
     
            <class name="WorkSpace" table="WORKSPACE" discriminator-value="W" lazy="false">
                    <id name="id" column="work_uid" type="long" unsaved-value="0">
                            <generator class="identity"/>
                    </id>
                    <discriminator column="WORKSPACE_TYPE" type="string"/>
     
    	<bag  name="gages" inverse="false" cascade="all" lazy="false">
    	    <key column="workspace_uid"/>
    	    <one-to-many class="dsi.emc.pac7000.core.sensor.Sensor"/>
    	</bag>	  
     
    	<subclass name = "DatabaseManager" discriminator-value="DATABASEMANAGER">
     	</subclass>
    	<subclass name = "HardDisk" discriminator-value="HARDDISK">
    	    <property  name="gageFileKey" column="GAGE_FILE_KEY" type="int"/>
    	</subclass>
     
            </class>
    Si mon workspace ne contient que des Manual ou Demo Sensor, il n'y a aucune erreur, mais un DigitalGage ne passe, voici l'erreur :


    org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of dsi.emc.pac7000.core.persistence.DatabaseManager.setGages
    at org.hibernate.tuple.PojoTuplizer.setPropertyValuesWithOptimizer(PojoTuplizer.java:203)
    at org.hibernate.tuple.PojoTuplizer.setPropertyValues(PojoTuplizer.java:173)
    at org.hibernate.persister.entity.BasicEntityPersister.setPropertyValues(BasicEntityPersister.java:2919)
    at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:113)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:530)
    at org.hibernate.loader.Loader.doQuery(Loader.java:436)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
    at org.hibernate.loader.Loader.doList(Loader.java:1593)
    at org.hibernate.loader.Loader.list(Loader.java:1577)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:844)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
    at dsi.emc.pac7000.core.persistence.DatabaseManager.getWorkSpace(DatabaseManager.java:343)
    ... 16 more
    Caused by: org.hibernate.WrongClassException: Object with id: 1 was not of the specified subclass: dsi.emc.pac7000.core.sensor.gagetalker.AbstractGage (Discriminator: DEMOSENSOR)
    at org.hibernate.loader.Loader.getInstanceClass(Loader.java:1046)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:924)
    at org.hibernate.loader.Loader.getRow(Loader.java:855)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:305)
    at org.hibernate.loader.Loader.doQuery(Loader.java:412)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
    at org.hibernate.loader.Loader.loadCollection(Loader.java:1434)
    at org.hibernate.loader.collection.OneToManyLoader.initialize(OneToManyLoader.java:111)
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:488)
    at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
    at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1430)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:176)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:48)
    at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:449)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuffer.append(Unknown Source)
    at dsi.emc.pac7000.core.persistence.WorkSpace.setGages(WorkSpace.java:339)
    ... 18 more


    et si on regarde la table SENSOR, voila le resultat.

    sensor_uid....SENSOR_TYPE........ NAME.........workspace_uid
    ___________________________________________________
    ......1........... DEMOSENSOR ....Démonstration.....1
    ......2........... MANUALSENSOR...Clavier...............1
    ......3........... DIGITALGAGE.......... a...................1

    si quelqu'un voit d'ou cela peut venir, j'ai vérifié mes classes, j'ai bien :
    public class DemoSensor extends Sensor
    public class ManualSensor extends Sensor
    public abstract class AbstractGage extends Sensor
    public class DigitalGage extends AbstractGage

    donc je ne comprends pas d'ou cela peut venir.

    MErci d'avance pour votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Par défaut
    Bonjour,

    j'emets une hypothèse :
    Hibernate ne sais pas gérer deux niveaux d'héritage (ta classe DigitalGage doit hériter directement de Sensor) ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    je pense qu'il peut gérer plusieurs niveaux d'héritage car dans le livre Hibernate3.0 il y a un exemple avec Superstar qui hérite de Player qui hérite lui même de Personn
    et j'ai repris cette exemple pour réaliser mon mapping...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    j'ai changé mon mapping en utilisant la statégie "une classe par sous classe"; apparement l'erreur a disparu.

    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="dsi.emc.pac7000.core.sensor">
     
            <class name="Sensor" table="SENSOR" discriminator-value="S">
                    <id name="id" column="sensor_uid" type="long" unsaved-value="0">
                            <generator class="identity"/>
                    </id>
     
                    <property  name="name" column="NAME" type="string"/>
     
    				<joined-subclass name = "dsi.emc.pac7000.core.sensor.demo.DemoSensor" table="DEMOSENSOR">
    					<key column="DEMOSENSOR_ID"/>
     
    				<joined-subclass name = "dsi.emc.pac7000.core.sensor.manual.ManualSensor" table="MANUALSENSOR">
    					<key column="MANUALSENSOR_ID"/>
     				</joined-subclass>
     
    				<joined-subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.AbstractGage" table="ABSTRACTGAGE">
    					<key column="ABSTRACTGAGE_ID"/>
    	                <property  		name="nbMinValue" 	column="NB_MIN" 		type="int"/>
     
    					<joined-subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.DigitalGage" table="DIGITALGAGE">
    						<key column="DIGITALGAGE_ID"/>
    	 				</joined-subclass>
    					<joined-subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.AnalogGage" table="ANALOGGAGE">
    						<key column="ANALOGGAGE_ID"/>
    		                <property  name="typeAnalog" 	column="TYPE_ANALOG"	type="int"/>
    	 				</joined-subclass>
    					<joined-subclass name = "dsi.emc.pac7000.core.sensor.gagetalker.Rs232Gage" table="RS232GAGE">
    						<key column="RS232GAGE_ID"/>
    		                <property  name="search1" 			column="SEARCH_1"	type="string"/>
    		                <property  name="search2" 			column="SEARCH_2"	type="string"/>
    		                <property  name="field" 			column="FIELD" 		type="int"/>
    						<bag  name="buffers" inverse="false" cascade="all-delete-orphan">
    							<key column="buffer_uid"/>
    							<one-to-many class="dsi.emc.pac7000.core.sensor.gagetalker.Rs232GageBuffer"/>
    						</bag>	  
    		                <property  name="buffer" 			column="BUFFER"	type="string"/>
    	 				</joined-subclass>
     				</joined-subclass>
     
     
            </class>
    </hibernate-mapping>

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

Discussions similaires

  1. [Héritage] Subclass hibernate
    Par Thomas_ats dans le forum Hibernate
    Réponses: 1
    Dernier message: 26/01/2009, 20h59
  2. Réponses: 10
    Dernier message: 20/01/2006, 11h50
  3. [Hibernate] Exception bizarre NoSuchElementException
    Par lilou77 dans le forum Hibernate
    Réponses: 3
    Dernier message: 17/01/2006, 15h44
  4. [Hibernate] exception entre MySQL et MS SQL
    Par lilou77 dans le forum Hibernate
    Réponses: 7
    Dernier message: 13/01/2006, 11h52
  5. [Hibernate exception]
    Par agougeon dans le forum Hibernate
    Réponses: 7
    Dernier message: 08/01/2006, 17h36

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