java - 将枚举映射到表列,其中数据库值是枚举字段,而不是标签

标签 java hibernate jpa enums

我的枚举看起来像这样

public enum EventType {

    DATASET_DELETION("DSDEL");

    private static final Map<String, EventType> dbIdLookup = new HashMap<>();

    static {
        for (EventType type : EnumSet.allOf(EventType.class)) {
            String databaseID = type.getId();
            dbIdLookup.put(databaseID, type);
        }
    }

    private String id;

    EventType(String _id) {

        this.id = _id;
    }

    public String getId() {
        return this.id;
    }

    public EventType getFromDatabaseID(String _databaseID) {

        EventType result = dbIdLookup.get(_databaseID);

        return result;
    }
}

其中 DATASET_DELETION 是我想要在 java 代码中引用的字段值,DSDEL 是我想要将其映射到数据库中的值。我希望数据库代码更紧凑,java标签更可读。

我当前的映射不起作用:

@Column(name = "EVENT_TYPE")
private EventType type;

throw

java.lang.RuntimeException: java.lang.IllegalArgumentException: Unknown name value for enum class blah.blah.EventType: DSDEL

如何将枚举映射到数据库值,该值不是枚举的主标签,而是声明中的字段之一?

最佳答案

JPA 不支持任意枚举值,仅提供对“ordinal”或“name”持久性的支持。 Improvements have been requested for inclusion in JPA 2.2+但谁知道什么时候(如果)会发生。

一种方法(可移植)是为该 Enum 类型提供 JPA AttributeConverter,以便它将 Enum 转换为 String,并保留您内部拥有的任意 String 值。

一些 JPA 提供程序支持自定义处理,例如 one in DataNucleus JPA 。也许您的提供商也有一些东西?

关于java - 将枚举映射到表列,其中数据库值是枚举字段,而不是标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39278729/

相关文章:

java - 如何从 JPQLQuery 获取 SQL 字符串

java - JScrollpane中的JTable调整显示组件的高度

java - 将字符串拆分为列表、排序并保持顺序

java - 替换 Zip 存档中的特定文件,而不用 Java 提取整个存档

java - 集合中的 Hibernate 集合

json - JAX-RS + JPA,如何只更新/合并实体字段的一个子集?

java - 如何在 Java 中的 JOptionPane.showInputDialog() 上显示图标?

java - Spring + hibernate : manually commit the transaction at end

java - 未找到 Postgresql + Hibernate 5 列但列存在

mysql - Spring Boot 和 Dao