2011-11-18 18 views
6

Supponiamo di avere un dizionario (ad esempio: MASCHIO, FEMMINILE) utilizzato nella mia applicazione.Implementazione del dizionario basato su enum in JPA 2

Vorrei utilizzare questo dizionario come Java enum. Inoltre, i valori di questo dizionario sono referenziati da una serie di altre tabelle, quindi ti piacerebbe avere una tabella separata.

Java enum non può essere un'entità. Posso utilizzare l'attributo enum (annotato come @Enumerated) nelle mie classi di entità, ma questo salverà l'enumerazione (come un intero, char o String) in ogni tabella che usano questo enum invece di utilizzare un FK al tavolo dizionario.

Come implementare tale caso d'uso?
- Creare un'entità Dictionary con metodo statico che produce valori enum?
- Getter e setter modificati per Dictionary che restituisce un'istanza enum anziché ?
- ... o forse non hai mai avuto bisogno di mantenere un enum in una tabella separata?

risposta

0

È possibile definire la tabella del dizionario utilizzando i valori di ID intero che corrispondono ai numeri ordinali del proprio enum. Questo è fragile, come molti hanno notato, dal momento che non è possibile modificare facilmente i valori: JPA si basa sul metodo ordinal() quando si utilizza il modificatore EnumType.ORDINAL sull'annotazione @Enumerated.

Marginalmente migliore, è possibile specificare EnumType.STRING e definire la colonna chiave primaria della tabella del dizionario come VARCHAR, con valori uguali ai nomi dei valori di enum. Questo è ancora fragile, in quanto non è più possibile modificare i nomi enum.

Il answer for this question mostra un'altra opzione: Attaccare con numeri interi nell'entità, ma tradurre i vostri accessor.

0

Questo può essere ottenuto con questo approccio.

1. Enum in cui il vostro grado di memorizzare ID

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

private final Long id; 

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

public Long getId(){ 
    return id; 
} 

2. In relazione a questo enum un'entità separata

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

3. Guardate EntityManager # findById

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

Ovviamente la tabella RefGenderEntity può ora essere prepopolata con due valori, e il tuo sistema funzionerà correttamente con chiavi esterne e normali normali join di lavoro.

Problemi correlati