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 :
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
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>
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.
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 (?, ?, ?)]
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.
Partager