Как добавить карту <String, Person> в класс сущности?

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

Map<String, Person> personMap;

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

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

Ответ 1

В соответствии с разделом 2.7 JSR-317, если значение Карты является сущностью (в вашем случае), создается таблица соединений, а затем следует использовать аннотацию 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;

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