1

很抱歉打扰 - 也许这是一个非常简单的问题 - 但由于某种原因,下面的版本无法解析,而带有 set 的版本工作正常。事实上,如果我只是使用 set 版本并将 set 替换为 list 我得到:

嵌套异常是 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>
4

2 回答 2

5

你说

而带有 set 的版本工作正常

这里列出 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*
)>

如您所见,列表元素需要 index 或 list-index element,一个关键元素,以及以下之一

  • 元素
  • 一对多
  • 多对多
  • 复合元素
  • 多对任意

这里是列表索引 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>

但是,如果您想使用列表而不是集合并且没有 list-index 列,则可以使用 bag 代替。初始化如下

Collection<SpreadsheetImportTemplateColumn> columns = new ArrayList<SpreadsheetImportTemplateColumn>();

而是定义这个映射

<bag name="columns">
     <key column="template_id" not-null="true"/>
     <one-to-many class="SpreadsheetImportTemplateColumn"/>
</bag>
于 2010-08-27T02:01:12.533 回答
0

在 Hibernate 中,List 必须指定一个索引列。

请参阅Hibernate 文档的第 6.2.3 节。

于 2010-08-27T01:23:43.280 回答