2017-07-01 145 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