Enum in Hibernate,坚持作为枚举

nik*_*ers 39 java mysql orm enums hibernate

在我的MySQL数据库中,有"性别枚举('男性','女性')"

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

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

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

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

Pas*_*ent 27

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

所以,我实际上认为你必须使用自己的UsereType,我建议使用灵活的解决方案 -来自Java 5 EnumUserType的工作版本(参见Appfuse的Java 5 Enums Persistence with Hibernate).

就个人而言,我只是忘记了使用MySQL枚举的想法,我不相信"好处"是值得的(更多细节见这个答案).


小智 24

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

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

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

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;
Run Code Online (Sandbox Code Playgroud)


Juh*_*älä 17

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

enum Gender {
  male,
  female
}
Run Code Online (Sandbox Code Playgroud)

注意小写值.

这将至少与VARCHAR列一起使用.它会将枚举存储为字符串"男性"或"女性".

  • 你真的尝试过我的建议吗?mysql中的性别类型可能只是varchar或char列周围的一些包装/语法糖. (4认同)
  • 如上所述,我使用枚举类型列,而不是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>
Run Code Online (Sandbox Code Playgroud)

  • 如何使用注释来做到这一点? (2认同)