Как сопоставить карту‹String,Double›

Я пытался

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

любая идея?


person Nhaolio    schedule 08.10.2010    source источник


Ответы (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 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;
  • The name of the collection table for the Map is defined using the JoinTable
    • The name of the column for the key to the parent is set using a JoinColumn in the JoinTable
  • Имя столбца для ключа карты определяется в MapKey
  • Имя столбца для значения карты определяется с помощью Column
person Pascal Thivent    schedule 08.10.2010
comment
Это @CollectionOfElements было то, что мне было нужно :) - person Nhaolio; 08.10.2010
comment
Большое спасибо ! Знаете ли вы, как настроить имена столбцов ELEMENT и MAPKEY? - person Nhaolio; 08.10.2010
comment
При использовании данных @ElementCollection Map‹String, Double›; Я получаю эту ошибку в hbm2ddl: org.hibernate.MappingException: Не удалось определить тип для: java.util.Map, в таблице: MYTABLE, для столбцов: [org.hibernate.mapping.Column(MYFIELD)] - person Wouter Lievens; 09.11.2010
comment
@Wouter Откройте вопрос, упомяните версию Hibernate и т. Д. (Но приведенный выше ответ верен в соответствии со спецификацией JPA 2.0). - person Pascal Thivent; 09.11.2010
comment
Проблема все еще существует, поэтому я последовал вашему предложению: stackoverflow.com/questions/6096525/ - person Wouter Lievens; 23.05.2011
comment
@org.hibernate.annotations.MapKey(targetElement = String.class, columns = @Column(name = SOME_KEY)) устарел: вместо него должен работать @MapKeyColumn(name=SOME_KEY) - person Nathan Feger; 25.01.2012