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