Java - 使用 Hibernate (HBM) 在数据库中引用 Enum(数字值)

标签 java hibernate enums hbm

我正在尝试将一个巨大的 Postgres 表中的文本字段转换为一个枚举,该表具有 (1, 2, 3, 4, __ALL) 等值。计划是将文本字段更新为数据库中的枚举。

我知道我不能在 Java 中执行如下 Enum 操作;

public enum MyEnum {
 1,2,3,4; 
}

我可以这样做;

public enum MyEnum {
  _1,_2,_3,_4;
}

或者:

public enum QuartileNumber {
   ONE("1"), TWO("2"), THREE("3"), FOUR("4"), __ALL("__ALL");
}

我的 hibernate 映射如下所示;

<property name="quartileNumber" column="quartile_number">
      <type name="com.altosresearch.model.PostgreSQLEnumType">
        <param name="enumClass">com.altosresearch.model.QuartileNumber</param>
        <param name="type">12</param>
      </type>
</property> 

使用此映射和我的 Java 枚举 (QuartileNumber);

QuartileNumbers.valueOf("__ALL") - 返回“_ALL”(com.altosresearch.model.QuartileNumber 的预期枚举类)

QuartileNumbers.valueOf("ONE") - 返回“ONE”(这显然会在数据库中被拒绝,因为它与数据库枚举值之一(1、2、3、4、__ALL)不匹配。

因此,我只能将值“__ALL”正确插入表中。还需要建议在此处插入值 1、2、3、4。谢谢!

注意:尝试使用数据库中相同的现有值(“1”、“2”、“3”、“4”、“__ALL”)以避免代码更改。

最佳答案

这里可以提供帮助的是使用枚举的 AttributeConverter。

这是来自 Thorben Janssen 的链接 https://thoughts-on-java.org/jpa-21-type-converter-better-way-to/

如何将枚举定义中的值保存在数据库中:1,2,3,4,__ALL:

public enum QuartileNumber {
   ONE("1"), TWO("2"), THREE("3"), FOUR("4"), __ALL("__ALL");
}

关于Java - 使用 Hibernate (HBM) 在数据库中引用 Enum(数字值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120697/

相关文章:

hibernate - Spring/Hibernate 延迟加载需要帮助

c++ - 如何访问另一个命名空间中作为模板类成员存在的枚举?

c# - 与枚举和公共(public)类(class)混淆 - 为什么它不起作用?

java - 为什么不能在上限泛型列表中添加元素?

java - Thread.sleep() 到 Swing 定时器的转换

java - Spring + Hibernate @autowired 在 ConstraintValidator 中为 null

java - 本地连接到 heroku postgresql 时出错

java - Java中返回先前枚举值的方法

java - OpenGL LWJGL 可调整大小的纹理立方体

java - 为 Headers 匹配 PHP 中的任何 PHP header() 标签