Mappa denormalizzato hibernate
-
30-09-2019 - |
Domanda
Ho una classe riepilogo che contiene un elenco di Qualità. Una qualità contiene un nome di stringa e un valore int. Questi dati vengono memorizzati in una struttura db denormalizzato, solo un tavolo, sia per la Sintesi e qualità.
Tavolo di qualità:
id, somefileds, qualityname1, qualityvalue1, qualityname2, qualityvalue2, qualityname3, qualityvalue3
Per ogni nome e valore di qualità coppie, un nuovo oggetto di qualità deve essere inserito nella classe di riepilogo.
Come mappare questo in ibernazione (xml hibernate mappatura)?
Soluzione
Non è chiaro come gli oggetti Quality
devono essere "inseriti" nella classe titolare Summary
ma penso che un tipo di utente personalizzato (sia o.h.u.UserType
o o.h.u.UserCollectionType
) è il modo di andare qui.
Fare riferimento alla sezione 5.2.3. tipi di valore personalizzato nella documentazione per maggiori dettagli (non c'è molto da dire sulla mappatura, è sufficiente specificare il tipo di utente personalizzato come type
nel mapping).
Altri suggerimenti
Sono riuscito a risolvere il problema con un'implementazione CompositeUserType personalizzato. L'aspetto file di mapping nel seguente modo:
<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>
Il returnedClass nel CompositeUserType è List.class, il metodo nullSafeSet ottiene la collezione come argomento value. E 'solo una questione di ottenere i valori dalla lista e assegnarli ai parametri nella dichiarazione preparata. (E riempire con valori null se mancano nella lista di Qualità).
Il metodo nullSafeGet è easyer. Mi basta creare un nuovo ArrayList in cui i nuovi oggetti di qualità vengono inseriti con i valori del gruppo di risultati.
posso aggiungere un esempio completo se interessati.