2017-07-01 205 views
0

我有类Person映射与枚举Sex注释性别如果是男性或女性。让我们看看:Hibernate @Enumerated似乎被忽略

@Entity 
@Table(name = "PERSON") 
public class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @Enumerated(EnumType.STRING) 
    @Column(name = "SEX") 
    private Sex sex; 

    private enum Sex { 
     M, 
     F; 
    } 

    // Getters, setters & constructors 
} 

当我测试从MySQL数据库获取所有行时,它的工作原理和映射是正确的。

数据库已经预先定义,这里是列的定义:

found [enum (Types#CHAR)], but expecting [varchar(255) (Types#VARCHAR)] 

的错误是有点不同(expecting [integer (Types#INTEGER)]):

`SEX` enum('M','F') NOT NULL 

但是当我配置与hibernate.hbm2ddl.auto=validate休眠出现错误当我使用EnumType.ORDINAL或根本没有@Enumerated时发生。

我该怎么做?

回答

1

尝试添加columnDefinition

@Enumerated(EnumType.STRING) 
@Column(name = "SEX" , columnDefinition="ENUM('M','S')" ,nullable = false) 
private Sex sex; 

休眠验证做检查类型,lenght ....因为你有这样的分贝水平验证认为这是不同类型的。

我没有看到它与甲骨文,但与MySql它可能是

+0

即使没有'nullable = false'也能正常工作。谢谢。难道你不知道为什么只有'@ Enumerated'被放置时Hibernate才会验证吗?为什么需要再次明确定义'ENUM('M','F')? –

+2

它是冗长的,它在Java代码中的两个地方重复枚举声明。以这个价格,我不会在MySQL中使用一个枚举类型,而是一个varchar,并且会在此列上添加一个约束来指定可接受的值。 – davidxxx

+0

由于你映射值的形式db到enum.in db你可以更新这个值,你的代码停止工作 – xyz