【问题标题】:Hibernate one to many mapping works with a list but not a set?休眠一对多映射适用于列表而不是集合?
【发布时间】:2010-08-27 01:17:49
【问题描述】:

抱歉打扰 - 也许这是一个非常简单的问题 - 但由于某种原因,下面的版本无法解析,而带有 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>

【问题讨论】:

    标签: java hibernate orm hibernate-mapping


    【解决方案1】:

    你说

    而带有 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 元素、关键元素和以下之一

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

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

    【讨论】:

      【解决方案2】:

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

      请参阅Hibernate documentation 的第 6.2.3 节。

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 2023-03-14
        • 2012-04-07
        • 2011-10-25
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多