代码之家  ›  专栏  ›  技术社区  ›  Nathan Feger

如何使用hibernate jpa注释映射嵌套集合map<key,list<values>>?

  •  12
  • Nathan Feger  · 技术社区  · 15 年前

    我有一门课,我不知道如何正确注释。

    我对Holder的目标:数据:

    • list应该保持顺序,而不是通过比较器,而是通过数组中元素的自然顺序。(如果有帮助的话,它可以是NDX列)。
    • holder将只引用数据,因此cascade all也可能适用。

    我也接受一个不同的设计,删除地图,如果这将使一个更清洁的设计。

    @Entity
    public class Holder extends DomainObject {
      private Map<Enum,List<Element>> data;
    }
    
    @Entity
    public class Element extends DomainObject {
      private long valueId;
      private int otherData;
    }
    
    @Mappedsuperclass
    public class DomainObject {
     // provides id
     // optimistic locking
     // create and update date
    }
    
    3 回复  |  直到 14 年前
        1
  •  8
  •   Maarten Winkels    15 年前

    我不认为hibernate(-core)可以映射任何集合:

    集合可以包含几乎任何 其他休眠类型,包括 基本类型、自定义类型、组件, 当然,提到其他 实体。

    (从 the official doc )

    注意到 几乎 以及集合类型的省略。

    解决方法:需要在集合持有者和元素之间引入一个新类型。这种类型可以映射为实体或组件,它指的是地图的原始内容,在这种情况下是一个列表。

    类似于:

    @Entity
    public class Holder extends DomainObject {
      @OneToMany
      private Map<Enum,InBetween> inBetweens;
    }
    
    @Entity
    public class InBetween extends DomainObject {
      @OneToMany
      private List<Element> elements;
    }
    
    @Entity
    public class Element extends DomainObject {
      private long valueId;
      private int otherData;
    }
    
    @Mappedsuperclass
    public class DomainObject {
     // provides id
     // optimistic locking
     // create and update date
    }
    

    其余的映射取决于您的特定情况,但相当简单。

        2
  •  2
  •   Anton    15 年前

    这是一个关于hibernate中收藏的博客 http://blog.xebia.com/2007/10/05/mapping-multimaps-with-hibernate/

    希望能有所帮助。它帮助了我。

    当做, 安东

        3
  •  -1
  •   ngeek    14 年前

    请注意,指向hibernate文档的引用链接似乎已过期,我发现以下操作有效: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/collections.html