【问题标题】:Saving special characters in Enum data type以枚举数据类型保存特殊字符
【发布时间】:2015-04-14 13:54:09
【问题描述】:

我想在数据库表中存储和检索特殊字符(/* 等)。这是我的尝试:

public enum SpecialCharacters {
    Hack("H/K"), Gk("G*M");

    private String value;

    private SpecialCharacters(String value) {
        this.value = value;
    }

    public String toString() {
        return this.value; // This will return , # or +
    }
}

@Column(name = "Special_Char")
@Enumerated(EnumType.STRING)
private SpecialCharacters specialCharacters;
...

但在 DB 表中它只存储枚举字段名称,如 HackGk,而不是 H/KG*M

【问题讨论】:

  • 为什么你认为存储枚举名称是错误的?
  • 你不能只使用检索到的枚举中toString返回的值吗?

标签: java jpa


【解决方案1】:

使用@Enumerated 注解,您只能存储枚举的名称或序号。使用 JPA 2.1,您可以使用 @Converter 注释。

请参阅specification 的第 11.1.10 章。

例子:

枚举:

public enum SpecialCharacter {
    Hack("H/K"),
    Gk("G*M");

    private String value;

    private SpecialCharacter(String value) {
        this.value = value;
    }

    public String toString() {
        return this.value; // This will return , # or +
    }

    public static SpecialCharacter valueOfKey(String key) {
        for (SpecialCharacter specialCharacter : values()) {
            if (specialCharacter.toString().equals(key)) {
                return specialCharacter;
            }
        }
        throw new IllegalArgumentException("Illegal key");
    }
}

转换器类:

@Converter(autoApply = true)
public class SpecialCharacterConverter implements AttributeConverter<SpecialCharacter, String> {

    /**
     * Converts a {@link SpecialCharacter} to the correspondig String that is used in the database
     */
    @Override
    public String convertToDatabaseColumn(SpecialCharacter specialCharacter) {
        return specialCharacter.toString();
    }

    /**
     * Converts a String from the database to the corresponding {@link SpecialCharacter}.
     */
    @Override
    public SpecialCharacter convertToEntityAttribute(String dbValue) {
        return SpecialCharacter.valueOfKey(dbValue);
    }

}

实体-对象:

@Entity
public class SomeEntity {

    @Column(name = "Special_Char")
    private SpecialCharacter specialCharacter;

    public SpecialCharacter getSpecialCharacter() {
        return this.specialCharacter;
    }

    public void setSpecialCharacter(SpecialCharacter specialCharacter) {
        this.specialCharacter = specialCharacter;
    }
}

【讨论】:

  • 我试过了,但它在我的数据库中存储了序数值
  • 您使用的是 JPA 2.1 实现吗?不要忘记“autoApply = true”。
  • 是的,我正在使用 JPA 2.1
  • 我可以确认上述解决方案有效。我们正在使用eclipselink。如果使用 javax.persistence.Convert 注释实体类中的字段会发生什么? -->@Convert(converter = SpecialCharacterConverter.class)
  • 在 DB 中它只存储序数值而不是存储值。我已经检查了使用此代码的所有可能方式。有什么建议吗?
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2014-07-23
相关资源
最近更新 更多