java - 在 Enum 数据类型中保存特殊字符

标签 java jpa

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

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

最佳答案

使用@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;
    }
}

关于java - 在 Enum 数据类型中保存特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29629265/

相关文章:

java - NonUniqueObjectException session 不包含对象本身?

java - 在 JPA 中设置列​​的默认值

java - 如何在java中为实体实现状态转换?

java - 无法弄清楚如何使用 Jbutton 调用方法

java - 使用静态私有(private)方法真的比实例私有(private)方法更快/更好吗?

Java - 编译错误 : cannot access Function

java - 如何在 aem groovy 控制台中获取服务?

hibernate - Play Framework 和集合在模型类中的使用

java - Hibernate AttributeOverride 注释错误

java - 获取持久性单元名称