2011-11-18 16 views
6

Supongamos que tengo un diccionario (es decir, sexo: HOMBRE, HEMBRA) utilizado en mi aplicación.Implementación del diccionario basado en enum en JPA 2

Me gustaría utilizar este diccionario como Java enum. Además, estos valores de diccionario se referencian a partir de muchas otras tablas, por lo que desearía tener una tabla separada .

Java enum no puede ser una entidad. Puedo usar el atributo enum (anotado como @Enumerated) en mis clases de Entidad, pero guardará la enumeración (como un Entero, char o Cadena) en cada tabla que usa este enum en lugar de usar un FK en la tabla del diccionario.

¿Cómo implementaría tal caso de uso?
- Crear una entidad Dictionary con el método estático produciendo enum valores?
- getter y setter modificado para Dictionary que devuelve un enum en lugar de la instancia Dictionary?
- ... o tal vez nunca necesitó persistir un enum en una tabla separada?

Respuesta

0

Puede definir su tabla de diccionario utilizando valores de ID enteros que coinciden con los números ordinales de su enum. Esto es frágil, como muchos han notado, ya que no puede modificar fácilmente sus valores: JPA se basa en el método ordinal() cuando usa el modificador EnumType.ORDINAL en su anotación @Enumerated.

Marginalmente mejor, puede especificar EnumType.STRING y definir la columna de la clave principal de su tabla de diccionario como VARCHAR, con valores equivalentes a los enum. Esto sigue siendo frágil, ya no puede cambiar sus nombres enum.

El answer for this question muestra otra opción: quedarse con enteros en su entidad, pero traduciendo en sus accesos.

0

Esto se puede lograr con este enfoque.

1. Enumeración donde su puede almacenar ID

public enum Gender{ 
MALE(1L), 
FEMALE(2L); 

private final Long id; 

Gender(Long id) { 
    this.id= id; 
} 

public Long getId(){ 
    return id; 
} 

2. En relación con esta enumeración separada Entidad

public class RefGenderEntity { 
    private Long id; 
    private String value; 
    ...... 
} 

3. Mira a EntityManager # findById

MyObjectThatStoreIdForGender val = ...... ; 
RefGenderEntity gender = em.find(RefGenderEntity.class, val.getGenderId()); 

Por supuesto, la tabla RefGenderEntity ahora puede rellenarse previamente con dos valores, y usted estará bien con las claves externas y las uniones normales de trabajo normales.

Cuestiones relacionadas