9

我试过

@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)

任何的想法?

4

1 回答 1

23

好吧,错误信息很清楚: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
    • 父键的列名使用 aJoinColumn设置JoinTable
  • 映射键的列名在MapKey
  • 映射值的列名称使用Column
于 2010-10-08T01:09:44.673 回答