Carte dénormaliser mise en veille prolongée
-
30-09-2019 - |
Question
J'ai une classe Résumé qui contient une liste de qualités. Une qualité contient un nom de chaîne et de la valeur int. Ces données sont stockées dans une structure dénormalisé db, une seule table, à la fois sommaire et de la qualité.
Tableau Qualité:
id, somefileds, qualityname1, qualityvalue1, qualityname2, qualityvalue2, qualityname3, qualityvalue3
Pour chaque paire de nom de la qualité et la valeur, un nouvel objet de qualité doit être inséré dans la classe Résumé.
Comment mapper cette mise en veille prolongée en (mise en veille prolongée mapping XML)?
La solution
On ne sait pas comment les objets Quality
doivent être « insérés » dans la classe de porte-Summary
mais je pense qu'un type d'utilisateur personnalisé (soit o.h.u.UserType
ou o.h.u.UserCollectionType
) est le chemin à parcourir ici.
Reportez-vous à la section 5.2.3. types de valeur personnalisée dans la documentation pour plus de détails (il n'y a pas grand chose à dire au sujet de la mise en correspondance, il suffit de spécifier votre type d'utilisateur personnalisé comme type
dans le mapping).
Autres conseils
Je réussi à le fixer avec une implémentation CompositeUserType personnalisée. Les regards de fichier de mappage comme suit:
<property name="qualities" type="com.foo.bar.QualityCompositeUserType">
<column name="linkName1" />
<column name="linkQuality1" />
<column name="linkName2" />
<column name="linkQuality2" />
<column name="linkName3" />
<column name="linkQuality3" />
</property>
Le returnedClass dans le CompositeUserType est List.class, le procédé de nullSafeSet obtient la collection comme argument de valeur. Il est juste une question d'obtenir les valeurs de la liste et les affecter aux paramètres dans l'instruction préparée. (Et remplissage avec null si les valeurs sont manquantes dans la liste de qualités).
La méthode de nullSafeGet est easyer. Je viens de créer une nouvelle liste de tableaux dans lesquels les nouveaux objets de qualité sont insérés avec les valeurs du ResultSet.
Je peux ajouter un exemple complet si vous êtes intéressé.