如何在hibernate中使用顶级集合?

时间:2011-12-05 12:58:37

标签: hibernate orm hibernate-mapping

我正在尝试使用this帖子中描述的Top Level Collections概念:

以下是该帖子的一部分内容:

  

顶级收藏

     

顶级集合是在范围之外定义的集合   个人班级,可供所有班级使用   映射文件。方案

     

我们有一个类,Foo和一系列字符串(例如人物   我们希望在没有的情况下提供给其他课程的名称)   不断在每个内部声明集合定义。

Set Foo.getNames() // of String instances

<set role="names" table="names">
    <key column="id" type="string">
        <generator class="uuid.hex"/>
    </key>
    <element column="name" type="string"/>
</set>
<class name="Foo" table="foo"> 
    ... 
    <collection name="names" column="name_id" role="names"/> 
</class>
  

请注意,顶级集合需要自己的密钥生成器   这不能是指定的类型,因为它永远不会暴露给   调用应用程序。

     

同样,Person并不代表一个类。它只是一个集合   第二级持久对象 - 在本例中为Strings。另请注意   Names只是id而不是foo_id。这是为了让它被使用   各种课程。另外,因为我们不能使用Person的id作为   foo_id,我们在Foo中添加了person_id FK。双向性

     

这里没有双向关系,因为只有   涉及一个班级。

当我尝试在<set>元素上方的映射中使用<class>元素时,我开始收到错误。我认为hibernate无法识别<set>元素之外的<class>

任何人都知道如何使用Top Level Collections

请帮忙!

1 个答案:

答案 0 :(得分:0)

根据不再存在的网站上的信息,该备忘单是一个非常古老的备忘单。

我从2002年开始讨论Gavin King在hibernate 2中讨论不再支持它:http://www.mail-archive.com/hibernate-devel@lists.sourceforge.net/msg01188.html

在hibernate-mapping-1.1.dtd中,(可从http://www.jboss.org/dtd/hibernate/获得)最重要的元素是:

<!ELEMENT hibernate-mapping ( 
    (map|set|list|bag|array|primitive-array)*, 
    class*,
    query*
)>

在hibernate-mapping-2.0.dtd中,它是:

<!ELEMENT hibernate-mapping (
    meta*,
    import*, 
    (class|subclass|joined-subclass)*, 
    query*, 
    sql-query*
)>

在hibernate-mapping-3.0.dtd中:

<!ELEMENT hibernate-mapping (
    meta*,
    identifier-generator*,
    typedef*,
    filter-def*,
    import*,
    (class|subclass|joined-subclass|union-subclass)*,
    resultset*,
    (query|sql-query)*,
    filter-def*,
    fetch-profile*,
    database-object*
)>

hibernate中的顶级集合很久以前就被埋没了。