【问题标题】:How to Persist a specific attribute of an Enum in Hibernate?如何在 Hibernate 中持久化枚举的特定属性?
【发布时间】:2015-03-13 13:02:37
【问题描述】:

我在一个支持 bean 中有一个枚举属性,它有 2 个属性:“id”(int 属性)和“label”(String 属性)。在数据库中,我只需要保留“id”,但我仍然需要在我的视图中使用标签值。问题是:@Enumerated 只给了我使用 EnumType.ORDINAL 或 EnumType.STRING 的选项。有什么方法可以将枚举的“id”属性保留在数据库中? (顺便说一句...我正在使用休眠)。

谢谢!

【问题讨论】:

  • 你能解释一下为什么你需要控制枚举值在数据库中的存储方式吗?无论哪种方式,一旦重新加载,您都可以访问值的所有部分,因此主要关注点通常与通过其他机制访问数据库或管理实体定义的更改有关。

标签: java hibernate enums


【解决方案1】:

fd 的评论已经到位。不过,如果你真的需要这个,你可以稍微调整一下解决方案,而不是持久化一个枚举,你可以将它标记为 transient 并添加一个属性,例如enumId 到一个实体类,你会坚持下去。剩下的唯一事情就是通过enumId的getter和setter方法同步枚举的值

【讨论】:

    【解决方案2】:

    id 和属性是同一事物的两个方面。它们具有相同的含义。将它们都存储在数据库中是多余的,并且违反了数据库设计的第三范式。

    对于 JPA (Hibernate) 实体,我建议您将 ORDINAL(即 id)定义为您的字段,并按照上面“主从”的建议将字符串定义为瞬态。然后定义 @PostLoad 和 id 的设置器,使用 name() 将序数转换为名称(这是您的标签),并在标签的设置器中使用 valueOf(String name) 转换回来。

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多