Mapa desnormalizará hibernación
-
30-09-2019 - |
Pregunta
Tengo una clase de resumen que contiene una lista de cualidades. Una calidad contiene un nombre de cadena y el valor int. Estos datos se almacenan en una estructura db sin normalizar, sólo una mesa, por tanto Resumen y calidad.
Mesa de Calidad:
ID, somefileds, qualityname1, qualityvalue1, qualityname2, qualityvalue2, qualityname3, qualityvalue3
Para cada nombre y valor de calidad pares, un nuevo objeto de Calidad debe estar insertada en la clase de resumen.
Cómo asignar este en hibernación (Hibernate mapeo XML)?
Solución
No está claro cómo los objetos Quality
deben ser "insertados" en la clase titular Summary
pero creo que un tipo de usuario personalizado (ya sea o.h.u.UserType
o o.h.u.UserCollectionType
) es el camino a seguir aquí.
Consulte la sección 5.2.3. tipos de valores personalizada en la documentación para más detalles (no hay mucho que decir acerca de la asignación, sólo tiene que especificar su tipo de usuario personalizada como type
en el mapeo).
Otros consejos
I logró solucionarlo con una aplicación CompositeUserType personalizado. El archivo de correlación se ve de la siguiente manera:
<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>
El returnedClass en el CompositeUserType es List.class, el método nullSafeSet obtiene la colección como argumento de valor. Es sólo una cuestión de conseguir los valores de la lista y asignarlos a los parámetros de la declaración preparada. (Y relleno con un valor nulo si los valores que faltan en la lista de las cualidades).
El método nullSafeGet es easyer. Me acabo de crear un nuevo ArrayList en que los nuevos objetos de calidad se insertan con los valores del conjunto de resultados.
Me puede añadir un ejemplo completo si está interesado.