【问题标题】:JPA mapping a map where key is an EnumJPA 映射键为枚举的映射
【发布时间】:2016-12-13 06:09:57
【问题描述】:

我正在尝试创建一个实体,其中一个字段是带有 Enum 键的 Map:

public class MyEntity {

    @ElementCollection
    @CollectionTable(name="attributes", joinColumns=@JoinColumn(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) 放在我的字段上,因为这会导致异常。

对于如何实现这种期望的行为,我有什么选择吗? 非常感谢。

【问题讨论】:

标签: java hibernate jpa dictionary enums


【解决方案1】:

向@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<>();

【讨论】:

猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多