2011-09-23 9 views
11

Quiero agregar una asignación como¿Cómo agregar un mapa <String, Person> en una clase de entidad?

Map<String, Person> personMap; 

dentro de una clase de entidad, donde es Person la entidad. El Map es para identificar el Person exacto que corresponde al String (permita que sea un apodo de esa persona). La misma persona puede tener diferentes nombres y cuando se da cualquiera de los nombres, se debe encontrar el mismo Person.

La API Persistance utilizada es JPA y el proveedor es EclipseLink. ¿Qué anotación debería usar y cómo?

Respuesta

15

Según la sección 2.7 de JSR-317, si el valor del Mapa es una entidad (que es su caso) se crea una tabla de unión y se debe usar una anotación de OneToMany/ManyToOne.

En cuanto a la clave, si se trata de un Tipo básico, @MapKeyColumn se puede utilizar para personalizar la columna de asignación de la clave. Así que aquí es mi opinión sobre tu ejemplo:

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

EDITADO:

Después de algunas pruebas, la siguiente parece que funciona bastante bien:

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

Lo anterior genera una tabla de unión con tres campos : uno para la identificación del titular de la asignación, uno para la clave y otro para el valor.

+0

Funciona muy bien, pero la búsqueda automática no funciona para mí cuando leo elementos mapeados en el Mapa. – sealskej

Cuestiones relacionadas