2010-08-27 59 views
1

抱歉打扰 - 也许这是一个非常简单的问题 - 但由于某种原因,下面的版本无法解析,而集合的版本正常工作。事实上,如果我只取集版本和替换设定名单,我得到:休眠一对多的映射工作与一个列表,但不是一组?

嵌套的例外是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> 

回答

5

你说

而与集版本工作正常

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

屁股,你可以看到,列表元素需求无论是指数或列表 - 索引元素,一个关键元素,以及以下之一

  • 元件
  • 一个一对多
  • 许多一对多
  • 复合元件
  • 许多到任何

这里不用列表索引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> 
+0

非常详尽的回答,+1 – 2010-08-27 02:03:31