Enum in Hibernate,坚持作为枚举

时间:2010-01-29 08:24:32

标签: java mysql hibernate orm enums

在我的MySQL数据库中,有一栏“性别枚举('男','女')”

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

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

  

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

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

5 个答案:

答案 0 :(得分:26)

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

所以,我实际上认为您必须使用自己的UsereType,我建议您使用Java 5 EnumUserType中的灵活解决方案 - 工作版(有关示例,请参阅Appfuse的Java 5 Enums Persistence with Hibernate

就个人而言,我只是忘记了使用MySQL枚举的想法,我不相信“好处”是值得的(详见this answer)。

答案 1 :(得分:24)

如果你给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 :(得分:17)

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

enum Gender {
  male,
  female
}

注意小写值。

至少可以使用VARCHAR列。它会将枚举存储为字符串“男性”或“女性”。

答案 3 :(得分:5)

不确定为什么它不在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>

答案 4 :(得分:4)

不是这种情况,但如果有人使用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可以使读取序数值成为可能。