2016-08-07 2 views
3

Я пытаюсь создать объект, где один из поля является карта с Enum ключа:JPA отображение карты, где ключ является 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; 
} 

Attribute только простое перечисление без дополнительных полей или логики:

public enum Attribute { 
    ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3; 
} 

Это хорошо отображает и делает работу. Но таблица сбора, attributes создает с определением столбца integer для моего ключа карты, по умолчанию EnumType.ORDINAL. Для моих целей мне нужно, чтобы это была строка, но я не могу просто разместить @Enumerated(EnumType.STRING) на своем поле, так как это приводит к исключению.

Есть ли у меня какие-либо возможности, как я могу достичь этого желаемого поведения? Большое спасибо.

+6

Попробуйте @MapKeyEnumerated (EnumType.STRING). http://stackoverflow.com/questions/25439813/difference-between-mapkey-mapkeycolumn-and-mapkeyjoincolumn-in-hibernate –

+0

Да, это именно то, что я искал! Большое спасибо! – DruidKuma

+0

Добро пожаловать, счастлив, что это помогает. –

ответ

4

Престижность @BilalBOUTAYA

Ответ: использовать @MapKeyEnumerated.

Аннотации @Enumerated относятся к столбцу значения, который, очевидно, несовместим с аннотацией.

Пример:

@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<>(); 
Смежные вопросы