2010-08-27 27 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