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列一起使用.它会将枚举存储为字符串"男性"或"女性".
小智 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)
| 归档时间: |
|
| 查看次数: |
71058 次 |
| 最近记录: |