I tried
@ManyToMany(cascade = CascadeType.ALL)
Map<String, Double> data = new HashMap<String, Double>();
but it produces the error :
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)
any idea?
Well, the error message is pretty clear: Double
isn't an entity. If you want to map a collection of basic elements, use the CollectionOfElement
annotation (from Hibernate) or the ElementCollection
annotation (from JPA 2.0).
So, assuming you're using Hibernate Annotations 3.4, try this:
@CollectionOfElements(targetElement = Double.class)
@org.hibernate.annotations.MapKey(targetElement = String.class)
Map data;
Or, when using generics:
@CollectionOfElements
Map<String, Double> data;
And if you're using Hibernate Annotations 3.5+, prefer the JPA 2.0 annotations:
@ElementCollection(targetClass = Double.class)
@MapKeyClass(String.class)
Map data;
Or, when using generics:
@ElementCollection
Map<String, Double> data;
Do you know how to customize the "ELEMENT" and "MAPKEY" column names ?
You can fully customize the result. I think the sample below demonstrates everything:
@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
is defined using the JoinTable
JoinColumn
in the JoinTable
MapKey
Column