【问题标题】:How to map a Map<String,Double>如何映射 Map<String,Double>
【发布时间】:2010-10-08 00:02:40
【问题描述】:

我试过了

@ManyToMany(cascade = CascadeType.ALL)
Map<String, Double> data = new HashMap<String, Double>();

但它会产生错误:

   org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.company.Klass.data[java.lang.Double]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1016)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:567)
at org.hibernate.cfg.annotations.MapBinder$1.secondPass(MapBinder.java:80)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115)

有什么想法吗?

【问题讨论】:

    标签: java hibernate orm jpa hibernate-annotations


    【解决方案1】:

    嗯,错误信息很清楚:Double 不是实体。如果要映射基本元素的集合,请使用 CollectionOfElement 注释(来自 Hibernate)或 ElementCollection 注释(来自 JPA 2.0)。

    所以,假设您使用的是 Hibernate Annotations 3.4,试试这个:

    @CollectionOfElements(targetElement = Double.class)
    @org.hibernate.annotations.MapKey(targetElement = String.class)
    Map data;
    

    或者,当使用泛型时:

    @CollectionOfElements
    Map<String, Double> data;
    

    如果您使用的是 Hibernate Annotations 3.5+,则更喜欢 JPA 2.0 注释:

    @ElementCollection(targetClass = Double.class)
    @MapKeyClass(String.class)
    Map data;
    

    或者,当使用泛型时:

    @ElementCollection
    Map<String, Double> data;
    

    参考文献


    您知道如何自定义“ELEMENT”和“MAPKEY”列名吗?

    您可以完全自定义结果。我认为下面的示例说明了一切:

    @CollectionOfElements(targetElement = Double.class)
    @JoinTable(name = "COLLECTION_TABLE", 
        joinColumns = @JoinColumn(name = "PARENT_ID"))
    @org.hibernate.annotations.MapKey(targetElement = String.class, 
        columns = @Column(name = "SOME_KEY"))
    @Column(name = "SOME_VALUE")
    private Map data;
    
    • Map 的集合表的名称是使用 JoinTable 定义的
      • 父键的列名使用JoinTable中的JoinColumn设置
    • 映射键的列名在MapKey中定义
    • 映射值的列名称使用Column 定义

    【讨论】:

    • 这个@CollectionOfElements 是我需要的:)
    • 非常感谢!你知道如何自定义“ELEMENT”和“MAPKEY”列名吗?
    • 当使用@ElementCollection Map 数据时;我在 hbm2ddl 中收到此错误:org.hibernate.MappingException:无法确定类型:java.util.Map,在表:MYTABLE,列:[org.hibernate.mapping.Column(MYFIELD)]
    • @Wouter 提出问题,提及 Hibernate 的版本等(但上述答案是正确的,根据 JPA 2.0 规范)。
    • @org.hibernate.annotations.MapKey(targetElement = String.class, columns = @Column(name = "SOME_KEY")) 已弃用:@MapKeyColumn(name="SOME_KEY") 应该在取而代之
    猜你喜欢
    • 2011-08-31
    • 2021-02-15
    • 2010-10-25
    • 2014-06-25
    • 1970-01-01
    • 2012-09-05
    • 2014-08-15
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多