Hibernate uno a molti lavori di mappatura con una lista, ma non un set?
-
01-10-2019 - |
Domanda
Siamo spiacenti di fastidio - forse questa è una domanda molto semplice - ma per qualche motivo la versione di seguito non riesce a ottenere analizzato, mentre la versione con il set funziona bene. In effetti, se mi basta prendere la variante di set e sostituire insieme con la lista ottengo:
eccezione annidata è org.hibernate.InvalidMappingException: Impossibile analizzare documento di mappaggio dalla mappatura valida
Grazie 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>
Soluzione
Hai detto
mentre la versione con il set funziona bene
Qui va 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*
)>
Ass si può vedere, elemento list ha bisogno sia indice o elemento della lista-index , un elemento chiave, e una delle seguenti opzioni
- elemento
- uno-a-molti
- molti-a-molti
- composite-element
- many-to-any
Qui va lista-index 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">
Quindi, si dovrebbe usare
<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>
Ma se si desidera utilizzare un elenco invece di un set di e non dispone di una colonna dell'elenco-index , è possibile utilizzare un sacchetto posto. Inizializza come segue
Collection<SpreadsheetImportTemplateColumn> columns = new ArrayList<SpreadsheetImportTemplateColumn>();
E definire questa mappatura invece
<bag name="columns">
<key column="template_id" not-null="true"/>
<one-to-many class="SpreadsheetImportTemplateColumn"/>
</bag>
Altri suggerimenti
In Hibernate, un elenco deve specificare una colonna di indice.
Si veda la sezione 6.2.3 della documentazione Hibernate .