【问题标题】:How to map Enum 0 on hibernate for a String identifier如何在休眠中映射 Enum 0 以获取字符串标识符
【发布时间】:2019-04-21 12:37:40
【问题描述】:

我对 Enum 值的映射有疑问。 在我的 Bonus.class 中,我有枚举属性 Type 和枚举类 BonusType。 这就是我定义枚举类的方式(只是枚举定义,没有复制任何方法或构造函数):

public enum EavType
{
  WORLDWIDE ("WORLDWIDE"),
  SIMPLE ("SIMPLE"),
  NOTVALID ("0");
}

到目前为止一切顺利。就我从数据库中获得“WORLDWIDE”或“SIMPLE”类型的 Bonus 元素而言,没有问题,但是当我在 type=0 的数据库上获得 Bonus 时,我得到一个错误:

Exception: java.lang.IllegalArgumentException: Unknown name value [0] for enum class [com.bosch.gam.commons.bo.remuneration.BonusType]

问题是我无法设置 NOTVALID 类型的保存方式,我从数据库中获取的数据是从另一个接口创建的,他们只是将其保存为 0。我还应该澄清 Bonus 表中的 Type 列是一个 VARCHAR2。

现在我的问题是:hibernate 是否将 0 解释为数字?我该如何解决这个问题?

【问题讨论】:

  • Hibernate 搜索名为“0”的枚举。如果您无法控制存储在数据库中的值,那么使用枚举不是一个好主意,如果您想在代码中更安全,请使用字符串,然后将其正确映射到您的枚举。
  • 感谢您的建议。问题是这是一个运行了 10 年的 Web 应用程序......将其更改为字符串将意味着无休止的变化:P
  • 我还试图避免使用休眠查询从数据库中获取 0 值:from Bonus e where e.assignment.id = :id and e.type != 'NOTVALID'e.type !='0',但没有任何效果。
  • 如果您可以更改查询并且您的枚举值很少,那么您可以解码字段“类型”以返回映射您的枚举的值。在您的示例中,映射前两种情况以返回自身,而所有其他值都返回“NOTVALID”。
  • 哦,谢谢,应该可以。但我并没有百分百关注你。默认值是在枚举上还是在休眠映射上?我对枚举的默认值很陌生...

标签: java hibernate jakarta-ee enums hibernate-mapping


【解决方案1】:

如果您不能使用 AttributeConverters (baeldung jpa attribute converters),您可以在 bean 中使用相同的方法。 在您的班级“奖金”中:

  • 创建一个字符串类型的新字段,例如dbEavType
  • 将此新字段映射到数据库列“type”
  • 实现这个新字段的 set 和 get 以使字符串值适应 EavType 的枚举值,进行预期的转换(例如,如果在 dbEavType 中设置“0”,然后在 eavType 字段中设置 NOTVALID)

此解决方案允许您根据需要调整值,并且不会破坏可以继续使用枚举的应用程序的其他层。

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2017-03-04
    • 2010-12-11
    相关资源
    最近更新 更多