Hibernate uno a muchos trabajos de mapeo con una lista pero no un conjunto?
-
01-10-2019 - |
Pregunta
Lo siento molestar - tal vez esta es una pregunta muy simple - pero por alguna razón la versión más adelante no obtiene el analizado, mientras que la versión con el sistema funciona bien. De hecho, si sólo tomo la versión de memoria y colgar conjunto con la lista consigo:
excepción anidada es org.hibernate.InvalidMappingException: documento de mapeo no pudo analizar de cartografía no válido
Gracias Misha
<!-- bi-directional one-to-many association to SpreadsheetImportTemplateColumn -->
<list name="columns">
<!--
<set name="columns" lazy="false" inverse="true"
cascade="all-delete-orphan" sort="natural"
order-by="voided asc, preferred desc, date_created desc">
-->
<key column="template_id" not-null="true" />
<!--
<one-to-many class="SpreadsheetImportTemplateColumn" />
</set>
-->
</list>
Solución
Usted dijo
mientras que la versión con el sistema funciona bien
Aquí va la lista DOCTYPE
<!ELEMENT list (
meta*,
subselect?,
cache?,
synchronize*,
comment?,
key,
(index|list-index),
(element|one-to-many|many-to-many|composite-element|many-to-any),
loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?,
filter*
)>
Culo se puede ver, el elemento de la lista necesita ya sea el índice o elemento de la lista-index , un elemento clave, y una de las siguientes
- elemento
- uno-a-muchos
- muchos-a-muchos
- composite-element
- muchos-a-cualquier
Aquí va la lista índice DOCTYPE
<!-- Declares the type and column mapping for a collection index (array or list index, or key of a map). -->
<!ELEMENT list-index (column?)>
<!ATTLIST list-index column CDATA #IMPLIED>
<!ATTLIST list-index base CDATA "0">
Por lo que debe utilizar
<list name="columns">
<key column="template_id" not-null="true"/>
<list-index column="WHICH COLUMN SHOULD BE USED AS INDEX"/>
<one-to-many class="SpreadsheetImportTemplateColumn" />
</list>
Sin embargo, si desea utilizar una lista en lugar de un conjunto y no tiene una columna de lista de índice , puede utilizar una bolsa en su lugar. Inicializar como sigue
Collection<SpreadsheetImportTemplateColumn> columns = new ArrayList<SpreadsheetImportTemplateColumn>();
Y definir este mapeo lugar
<bag name="columns">
<key column="template_id" not-null="true"/>
<one-to-many class="SpreadsheetImportTemplateColumn"/>
</bag>
Otros consejos
En Hibernate, una lista debe especificar una columna de índice.
Véase la Sección 6.2.3 de la documentación Hibernate .