如何映射Map

我试过了

@ManyToMany(cascade = CascadeType.ALL) Map data = new HashMap(); 

但它会产生错误:

  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) 

任何想法?

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

因此,假设您正在使用Hibernate Annotations 3.4,请尝试以下方法:

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

或者,使用generics时:

 @CollectionOfElements Map data; 

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

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

或者,使用generics时:

 @ElementCollection Map data; 

参考

  • Hibernate Annotations 3.4参考指南
    • 2.4.6.2.2。 地图
    • 2.4.6.2.5。 元素或复合元素的集合
  • JPA 2.0规范
    • 第11.1.12节“ElementCollection注释”
    • 第11.1.28节“MapKeyClass注释”

你知道如何自定义“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定义的
    • 使用JoinTableJoinColumn设置父键的列的名称
  • 地图键的列名称在MapKey定义
  • 使用Column定义映射值的Column