在我的MySQL数据库中,有一栏“性别枚举('男','女')”
我创建了我的枚举“com.mydomain.myapp.enums.Gender”,在我的Person
实体中,我定义了“性别性别”。
现在我想在我的MySQL数据库中保留枚举类型,但是当我启动我的应用程序时,我得到:
MyApp.Person中针列属性的列类型错误。找到:枚举,预期:整数
这是为什么?这就好像我用“@Enumerated(EnumType.ORDINAL)”注释了我的“性别性别”,我没有。 EnumType似乎只能是ORDINAL或STRING,那么如何指定它应该将字段视为枚举,而不是int? (并不是说有太大的不同,但足以让它对此感到不安。)
答案 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可以使读取序数值成为可能。