Как составить карту - PullRequest
       16

Как составить карту

9 голосов
/ 08 октября 2010

Я пытался

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

есть идеи?

1 Ответ

23 голосов
/ 08 октября 2010

Ну, сообщение об ошибке довольно ясно: Double не является сущностью.Если вы хотите отобразить коллекцию базовых элементов, используйте аннотацию CollectionOfElement (из Hibernate) или аннотацию ElementCollection (из JPA 2.0).

Итак, если вы используете аннотации Hibernate 3.4,попробуйте это:

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

Или, при использовании дженериков:

@CollectionOfElements
Map<String, Double> data;

А если вы используете аннотации Hibernate 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
    • Имя столбца дляключ к родителю задается с помощью JoinColumn в JoinTable
  • Имя столбца для ключа карты определено в MapKey
  • Имя столбца для значения карты определяется с помощью Column
...