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] Polymorphisme implicite : dysfonctionnement


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Par défaut [Hibernate] Polymorphisme implicite : dysfonctionnement
    Salut,

    A partir du diagramme de classes suivant, j'ai généré les objets Java et cherche désormais à les lier à un SGBD via l'API Hibernate.

    ** Diagramme :



    Un objet 'EmbeddedMetadata' contient donc deux 'Map', l'une issue du lien de composition avec un objet AudioMetadata ou VideoMetadata, et l'autre issue de l'héritage de l'objet 'Information'.

    Le but recherché est d'adjoindre à des métadonnées d'un contenu multimédia d'autres métadonnées propres à l'utilisation de ces métadonnées dans l'application.

    Sous Hibernate, j'ai choisi la stratégie de mapping par polymorphisme implicite, avec les mappings suivants :

    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
     
    	<class name="AudioMetadata" table="audiometadata" polymorphism="implicit">
    		<id name="identifier" column="identifier" type="long">
    			<generator class="increment" />
    		</id>
    		<map name="data" cascade="all">
    			<key column="identifier" />
    			<index column="name" type="string" />
    			<element column="value" type="string" />
    		</map>
    	</class>
     
    	<class name="VideoMetadata" table="videometadata" polymorphism="implicit">
    		<id name="identifier" column="identifier" type="long">
    			<generator class="increment" />
    		</id>
    		<map name="data" cascade="all">
    			<key column="identifier" />
    			<index column="name" type="string" />
    			<element column="value" type="string" />
    		</map>
    	</class>
     
    	<class name="EmbeddedMetadata" table="embeddedmetadata" polymorphism="implicit">
    		<id name="identifier" column="identifier" type="long">
    			<generator class="increment" />
    		</id>
    		<map name="data" cascade="all">
    			<key column="identifier" />
    			<index column="name" type="string" />
    			<element column="value" type="string" />
    		</map>
    		<any name="multimediaMetadata" meta-type="string" id-type="long" cascade="all">
    			<meta-value value="audiocontentmetadata" class="AudioMetadata" />
    			<meta-value value="videocontentmetadata" class="VideoMetadata" />
    			<column name="metadataclass" />
    			<column name="metadataidentifier" />
    		</any>
    	</class>
    A l'exécution, j'obtiens l'erreur, 'data' correspondant au nom des deux 'Map', l'une héritée, l'autre composée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.sql.SQLException: Integrity constraint violation - no parent FKxxxxxxxxxxxx table: VIDEOMETADATA in statement [/* insert collection row AudioMetadata.data */ insert into data (identifier, name, value) values (?, ?, ?)]
    En outre, si je teste des métadonnées audio et que je supprime le mapping 'videometadata', l'exécution fonctionne, mais les métadonnées se retrouvent dupliquées dans les deux 'Map', et non pas réparties comme attendu.

    Aussi, si, dans le mapping de 'embeddedmetadata', je supprime la 'Map' et que je supprime le mapping 'videometada', l'exécution se passe bien, et je constate que les métadonnées du '<any name='multimediaMetada' ...>' sont bien réparties, et non dupliquées (je n'obtiens ici que les métadonnées attendues).

    Avez-vous une idée de ce qui ne va pas ici ?

    Merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Par défaut
    Ayé çà marche !

    Par contre, j'ai troqué la stratégie d'héritage par polymorphisme implicite contre la stratégie une-table-par-classe-concrète.

    Ca donne le mapping suivant :

    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
     
    	<class name="Information" lazy="false">
    		<id name="identifier" column="identifier" type="long">
    			<generator class="sequence"/>
    		</id>
    		<map name="data" cascade="all" lazy="false">
    			<key column="identifier" />
    			<index column="name" type="string" />
    			<element column="value" type="string" />
    		</map>
    		<union-subclass name="Metadata" table="metadata" lazy="false">
    			<union-subclass name="AudioMetadata" table="audiometadata" lazy="false">
    			</union-subclass>
    			<union-subclass name="VideoMetadata" table="videometadata" lazy="false">
    			</union-subclass>
        	</union-subclass>
    		<union-subclass name="EmbeddedMetadata" table="embeddedmetadata" lazy="false">
    			<any name="multimediaMetadata" meta-type="string" id-type="long" cascade="all" lazy="false">
    				<meta-value value="audiometadata" class="AudioMetadata" />
    				<meta-value value="videometadata" class="VideoMetadata" />
    				<column name="metadataclass" />
    				<column name="metadataidentifier" />
    			</any>
    		</union-subclass>
    	</class>
    Voilà, j'espère que çà aidera d'autres personnes qui cherchent à mapper un mélange héritage/composition.

    Par contre, la question de savoir pourquoi le polymorphisme implicite ne marchait pas, plus haut, tient toujours :

    Est-ce une erreur de programmation ?
    ou
    Est-ce une limite du polymorphisme implicite d'Hibernate ?

Discussions similaires

  1. Hibernate, Polymorphisme, et Select sont sur un bateau.
    Par andlio dans le forum Hibernate
    Réponses: 0
    Dernier message: 23/08/2011, 00h13
  2. [Hibernate] Where clause implicite
    Par pmartin8 dans le forum Hibernate
    Réponses: 9
    Dernier message: 16/06/2011, 02h21
  3. [DisplayTag] Utiliser un objet implicite recuperer à partir d'un mapping hibernate
    Par sel3aa dans le forum Taglibs
    Réponses: 3
    Dernier message: 04/02/2009, 15h05
  4. Réponses: 0
    Dernier message: 13/12/2007, 10h31
  5. Réponses: 6
    Dernier message: 24/08/2006, 14h33

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