Как добавить карту <String, Person> в класс сущности? - PullRequest
12 голосов
/ 23 сентября 2011

Я хочу добавить отображение как

Map<String, Person> personMap;

внутри класса сущности, где Person - сущность. Map должен идентифицировать точное Person, соответствующее String (пусть это будет псевдоним этого человека). У одного и того же человека могут быть разные имена, и всякий раз, когда дается какое-либо из имен, должен быть найден тот же самый Person

Используемый API сопротивления - JPA, а поставщик - EclipseLink. Какую аннотацию я должен использовать и как?

1 Ответ

20 голосов
/ 23 сентября 2011

В соответствии с разделом 2.7 JSR-317, если значением Map является сущность (в вашем случае), создается таблица соединения и затем должна использоваться аннотация OneToMany / ManyToOne.

Что касается ключа, то если это базовый тип, @MapKeyColumn можно использовать для настройки столбца сопоставления ключа. Итак, вот мой пример:

@OneToMany
@MapKeyColumn(name="person_nickname")
Map<String, Person> personMap;

РЕДАКТИРОВАНИЕ:

После некоторого тестирования кажется, что следующее работает довольно хорошо:

@ElementCollection
@CollectionTable(name="<name_of_join_table>")
@MapKeyColumn(name="<name_of_map_key_in_table>")
Map<String, Person> personMap;

Приведенное выше создает таблицу соединения с тремя полями: одно для идентификатора держателя сопоставления, одно для ключа и одно для значения.

...