Ответ 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;
Вышеприведенная таблица соединений содержит три поля: один для идентификатора владельца сопоставления, один для ключа и один для значения.