Hibernate One для многих сопоставления работает со списком, но не набор?
-
01-10-2019 - |
Вопрос
Извините, что беспокоит - возможно, это очень простой вопрос - но по какой-то причине версия ниже не удается проанализировать, тогда как версия с набором работает нормально. На самом деле, если я просто сделаю набор версию и замените набор списком, я получаю:
Вложенное исключение является org.hibernate.invalidmappingException: не мог проанализировать документ сопоставления от недействительных сопоставления
Спасибо, Миша
<!-- 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>
Решение
Ты сказал
тогда как версия с набором работает нормально
Здесь идет список dotype
<!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*
)>
Задница, которую вы можете увидеть, список элементов нуждается либо индекс или элемент индекса списка, ключевой элемент и одно из следующих
- элемент
- один ко многим
- многозначный
- составной элемент
- многие
Здесь идет список-индекс 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">
Так что вы должны использовать
<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>
Но если вы хотите использовать список вместо набора и не имеет столбца индекса списка, вы можете использовать мешок вместо этого. Инициализируйте следующим образом
Collection<SpreadsheetImportTemplateColumn> columns = new ArrayList<SpreadsheetImportTemplateColumn>();
И определить это отображение вместо
<bag name="columns">
<key column="template_id" not-null="true"/>
<one-to-many class="SpreadsheetImportTemplateColumn"/>
</bag>
Другие советы
В Hibernate список должен указать столбец индекса.
См. Раздел 6.2.3 из Hibernate Documentation.