2010-01-29 137 views
35

在我的MySQL数据库,还有我已经建立了我的枚举“com.mydomain.myapp.enums列“性别枚举(‘男’,‘女’)”枚举在Hibernate中,坚持为枚举

.Gender“,并在我的Person实体中定义了”性别性别“。

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

错列式在MyApp.Person列性别。发现:enum,expected:整数

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

+0

发送整数shud工作。男= 1,女= 2 – Cherian 2010-01-29 08:42:22

+0

使用Hibernate,你会如何建议我注释我的实体类来做到这一点?我已经尝试明确地定义我的枚举值“public enum Gender(MALE(1),FEMALE(2);}”在错误输出中没有区别 – niklassaers 2010-01-29 08:48:52

回答

23

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

所以,其实我认为你将不得不使用自己的UsereType,我会建议使用灵活的解决方案 - 从Java 5 EnumUserType工作版本(见AppFuse的Java 5 Enums Persistence with Hibernate的例子)。个人而言,我只是忘记了使用MySQL枚举的想法,我不相信“好处”是值得的(更多详细信息,请参阅this answer)。

18

尝试使用@Enumerated(EnumType.STRING),并这样定义

enum Gender { 
    male, 
    female 
} 

注意小写值的枚举。

这将至少与VARCHAR列一起工作。它会将枚举存储为字符串'male'或'female'。

+2

正如我写的,我使用的是枚举类型列,而不是varchar – niklassaers 2010-02-24 17:46:31

+4

您是否真的尝试我的建议?在mysql中的性别类型可能只是一些varchar或char列周围的包装/语法糖 – 2010-02-24 18:36:54

23

如果你给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; 
3

不是这个情况,但如果有人使用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> 

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

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> 
+0

Thx,这与MySQL ENUM列很好地工作,虽然12是VARCHAR – arun 2014-09-21 21:38:48

+0

如何使用注释做到这一点? – rajadilipkolli 2017-02-14 15:33:27