Hibernate one to many Mapping arbeitet mit einer Liste, aber nicht ein Satz?
-
01-10-2019 - |
Frage
Leider stören - vielleicht ist dies eine sehr einfache Frage - aber aus irgendeinem Grunde die Version nicht unter analysiert werden, während die Version mit einem Satz gut funktioniert. In der Tat, wenn ich die Set-Variante nehme nur und ersetzen mit Liste gesetzt erhalte ich:
verschachtelte Ausnahme ist org.hibernate.InvalidMappingException: Kann nicht analysiert Mapping-Dokument von ungültigem Mapping
Danke 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>
Lösung
Du hast gesagt,
, während die Version mit Satz funktioniert
Hier geht Liste 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 Sie können sehen, Listenelement muss entweder Index oder list-Index Element , ein Schlüsselelement, und eine der folgenden Optionen
- -Element
- one-to-many
- many-to-many
- Composite-Element
- many-to-any
Hier geht list-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">
So sollten Sie verwenden
<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>
Aber wenn Sie eine Liste statt eines Satzes verwenden möchten, und haben keine Liste-Index-Spalte , Sie stattdessen eine Tasche verwenden können. Initialisieren wie folgt
Collection<SpreadsheetImportTemplateColumn> columns = new ArrayList<SpreadsheetImportTemplateColumn>();
Und definieren diese Zuordnung statt
<bag name="columns">
<key column="template_id" not-null="true"/>
<one-to-many class="SpreadsheetImportTemplateColumn"/>
</bag>
Andere Tipps
In Hibernate, eine Liste muss eine Indexspalte angeben.
Siehe Abschnitt 6.2.3 der Hibernate Dokumentation .