【问题标题】:Enum in Hibernate, persisting as an enumHibernate 中的枚举,作为枚举持久存在
【发布时间】:2011-01-10 18:26:18
【问题描述】:

在我的 MySQL 数据库中,有“gender enum('male','female')”列

我创建了我的枚举“com.mydomain.myapp.enums.Gender”,并在我的Person 实体中定义了“性别性别”。

现在我想将枚举类型保留在我的 MySQL 数据库中,但是当我启动我的应用程序时,我得到:

MyApp.Person 中列 Gender 的列类型错误。找到:枚举,预期:整数

这是为什么?这相当于我用“@Enumerated(EnumType.ORDINAL)”注释了我的“性别性别”,但我没有。 EnumType 似乎只能是 ORDINAL 或 STRING,那么我如何指定它应该将字段视为枚举,而不是 int? (不是说有太大区别,但足以让它对此感到不安。)

【问题讨论】:

  • 发送整数不工作。男性 = 1 ,女性 = 2
  • 使用 Hibernate,你建议我如何注释我的实体类来做到这一点?我已经尝试明确定义我的枚举值“公共枚举性别(MALE(1),FEMALE(2);}”,错误输出没有区别

标签: java mysql hibernate orm enums


【解决方案1】:

如果你给 Hibernate 一个列定义,它不会尝试猜测:

@Column(columnDefinition = "enum('MALE','FEMALE')")
@Enumerated(EnumType.STRING)
private Gender gender;

如果您出于任何原因不依赖 Hibernate 生成架构,您甚至不必为 columnDefinition 提供实际值。这样,您可以删除需要保持值同步的实例。只需保持 Java 枚举和 Liquibase 或 SQL 脚本同步即可:

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;

【讨论】:

    【解决方案2】:

    我的理解是 MySQL 枚举类型是非常专有的,Hibernate 不能很好地支持,请参阅 Gavin King 的this comment(这个相关问题有点不同,但这不是重要的部分)。

    所以,我实际上认为您必须使用自己的 UsereType,我建议您使用 Java 5 EnumUserType 中的 灵活解决方案 - 工作版本(请参阅 Appfuse 的 @987654323以@为例)。

    就我个人而言,我只是忘记了使用 MySQL 枚举的想法,我不相信“好处”是值得的(有关更多详细信息,请参阅 this answer)。

    【讨论】:

      【解决方案3】:

      尝试使用@Enumerated(EnumType.STRING) 并像这样定义您的枚举

      enum Gender {
        male,
        female
      }
      

      注意小写值。

      这至少适用于 VARCHAR 列。它将枚举存储为字符串“男”或“女”。

      【讨论】:

      • 正如所写,我使用的是枚举类型列,而不是 varchar
      • 你真的尝试过我的建议吗? mysql 中的性别类型可能只是围绕 varchar 或 char 列的一些包装/语法糖。
      【解决方案4】:

      不确定为什么它不在 Hibernate 文档中 但你可以这样做

      <property name="type" column="type" not-null="true">
          <type name="org.hibernate.type.EnumType">
              <param name="enumClass">com.a.b.MyEnum</param>
              <param name="type">12</param>
              <!-- 12 is java.sql.Types.VARCHAR -->
          </type> 
      </property>
      

      【讨论】:

      • 谢谢,这适用于 MySQL ENUM 列,尽管 12 用于 VARCHAR
      • 如何用注解做到这一点?
      【解决方案5】:

      不适用于这种情况,但如果有人使用 XML 映射:

      <property name="state" column="state" not-null="true">
        <type name="org.hibernate.type.EnumType">
          <param name="enumClass">com.myorg.persistence.data.State</param>
        </type>
      </property>
      

      数据库列类型必须是数字,例如mysql 上的 tinyint 使读取序数值成为可能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 2015-08-08
        • 2010-11-26
        相关资源
        最近更新 更多