2016-08-07 49 views
3

Ich versuche, eine Einheit, wo man des Feldes ist eine Karte mit Enum Schlüssel zu erstellen:JPA-Mapping eine Karte, wo Schlüssel ist ein Enum

public class MyEntity { 

    @ElementCollection 
    @CollectionTable(name="attributes", [email protected](name="my_entity_id")) 
    @MapKeyColumn(name = "attribute_key") 
    @Column(name="attribute_value") 
    private Map<Attribute, String> attributes; 
} 

Die Attribute ist nur eine einfache Aufzählung ohne zusätzliche Felder oder Logik:

public enum Attribute { 
    ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3; 
} 

Diese Karten nett und funktionieren. Aber die Sammeltabelle attributes erstellt mit integer Spaltendefinition für meinen Map-Schlüssel, da der Standardwert EnumType.ORDINAL ist. Für meine Zwecke brauche ich es String, aber ich kann nicht einfach @Enumerated(EnumType.STRING) auf meinem Feld platzieren, da dies zu einer Ausnahme führt.

Habe ich irgendwelche Möglichkeiten, wie ich dieses gewünschte Verhalten erreichen kann? Vielen Dank.

+6

Versuchen @MapKeyEnumerated (EnumType.STRING). http://stackoverflow.com/questions/25439813/difference-between-mapkey-mapkeycolumn-and-mapkeyjoincolumn-in-hibernate –

+0

Ja, das ist genau das, was ich gesucht habe! Vielen Dank! – DruidKuma

+0

Willkommen, glücklich es hilft. –

Antwort

4

Ein großes Lob an @BilalBOUTAYA

Die Antwort ist: @MapKeyEnumerated verwenden.

Die Annotation @Enumerated gilt für die Wertspalte, die offensichtlich nicht mit der Annotation kompatibel ist.

Beispiel:

@JsonIgnore 
@ElementCollection(fetch = FetchType.LAZY) 
@CollectionTable(name = "FTT_REGISTRI_ESCLUSIONI", foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "FTT_FK_ESCLUSIONE_TO_REGISTRO"), joinColumns = @JoinColumn(name = "REGISTRO_ID")) 
@MapKeyColumn(name = "CLAUSOLA_ESCLUSIONE", length = 40, nullable = false) 
@MapKeyClass(FttEsclusioneType.class) 
@MapKeyEnumerated(EnumType.STRING) 
@Column(name = "RECORD_COUNT", nullable = false) 
protected final Map<FttEsclusioneType, Long> esclusioneRecordCounters = new HashMap<>();