Vamos a ver como configurar un mapa en JPA. Yo lo he necesitado por que tengo un enumerado asociado a un campo String (Que tiene un valor), en vez de crear un campo por cada valor, creo un map al que le paso el tipo y me devuelve el valor. Y si mañana necesito otro campo con la misma lógica, solo tengo que registrarlo en el enumerado y la B.D no se toca.
Ejemplo practico: Tengo 3 dimensiones para la visibilidad o entidades del sistema a las que le asocio una opción en el enumerado, a las cuales le aplico un comodín para saber a que usuarios aplico la seguridad. Por lo cual la lógica en el código es común y nos interesa, que el modelo de datos lo tengo en un mapa, para que sea escalable. Tocando solo el tipo enumerado.
Nota: Yo estas cosas las hago cuando ya hay 2 o mas casos, o este muy claro que va a crecer en los requisitos, es mas una excepción que otra cosa.
Como configurar el mapeo:
En este caso vamos a crear un mapeo de un tipo enumerado a un campo:
public enum TipoDimensiones{ Dim1,Dim2,Dim3 }
Añadimos el mapeo a la entidad en cuestión
@Entity public class Entity(){ @id private Long id; @ElementCollection @MapKeyColumn(name = "tipoDimension") @JoinTable(name="Entity_visivilidad", joinColumns=@JoinColumn(name="id")) @Column(name="valor") private Map<Tipodimensiones,String> visivilidad;
Ahora voy a explicar cada una de las anotaciones. para que entendamos que estamos haciendo y no copiemos como loros :P.
- ElementCollection: Indica que vamos a rellenar el collection a partir de una tabla.
- MapKeyColumn: Indica la clave del mapa, usaremos MapKeyColumn cuando sea un tipo básico, en caso de ser una entidad usaremos MapKey (Ojo con esto).
- JoinTable: Indicamos la tabla donde se va a persistir el mapa (atributo name) y como que campo de la entidad tenemos que relacionarlo (joinColumn) en nuestro caso es la clave primaria.
- Column: Le indicamos cual sera la columna que alimentara el valor.
Otra forma de configurar el mapeo
Esto hace lo mismo que lo anterior, pero si nos fijamos en la configuración anterior es un poco redundante el indicarle el id, cuando hibernate tiene la capacidad de saber cual es su id.
Por defecto hibernate utiliza el número de orden para saber cual es el enumerado ( Que corresponde por la posición en el enum que tenemos, si queremos por claridad o otras historias indicarle que el tipo enumerado de la clave guarde el string usaremos la anotación MapKeyEnumerated.
@ElementCollection @CollectionTable(name="Entity_visivilidad") @MapKeyEnumerated(EnumType.STRING) @MapKeyColumn( name = "tipoDimension" ) @Column(name="valor") private Map<Tipodimensiones,String>visivilidad;
No hay comentarios:
Publicar un comentario