2010-01-29 22 views
35

, benim enum "com.mydomain.myapp.enums oluşturduk sütun "cinsiyet enum ('erkek', 'kadın')"Enum, benim MySQL veritabanında

var .Gender "ve benim Person varlığım" Cinsiyet cinsiyeti "tanımladım.

Şimdi benim MySQL veritabanında enum türü depolamak istediğinizden ama benim uygulamayı başlatmak zaman olsun:

Yanlış sütun türü MyApp.Person sütun Cinsiyet için. Bulunan: enum, beklenen: tamsayı

Neden bu? Bu, "Cinsiyet Cinsiyeti" ni, henüz sahip olmadığım "@ EnumeType.ORDINAL" ile ekleyip açıklamamla eşdeğer olacaktır. EnumType sadece ORDINAL ya da STRING olarak görünebilir, bu nedenle alanı bir int gibi değil, bir enum olarak ele almayı nasıl belirleyebilirim? (Bu çok fazla fark yok, ama bu konuda üzülmek için yeterli değil.)

+0

gönderme tamsayılar işe shud yapabilirsiniz.male = 1, female = 2 – Cherian

+0

Hazırda Bekletme özelliğini kullanırken, Entity sınıfımı bunu yapmak için nasıl ek açıklama ekletirsiniz? Enum değerlerimi açık olarak tanımladım "public enum Cinsiyet (MALE (1), FEMALE (2);}" hata çıktısında hiçbir fark olmaksızın – niklassaers

cevap

23

Anlayışım, MySQL enum türünün çok tescilli ve Hibernate tarafından iyi desteklenmediği, Gavin King'den this comment'a bakın (bu ilgili sorun biraz farklı ama önemli olan bu değil).

Yani, aslında UsereType kendi kullanmak gerekecektir düşünüyorum ve ben Esnek çözüm kullanmak tavsiye ederim - Java 5 EnumUserType gelen sürüm çalışma (AppFuse en Java 5 Enums Persistence with Hibernate bir örnek için bakınız).

Şahsen ben sadece "faydaları" O (ayrıntılı bilgi için this answer bakınız) değer olduğuna ikna değilim, MySQL enum kullanmak fikri unuturdum.

18

@Enumerated (EnumType.STRING) kullanın ve bu

enum Gender { 
    male, 
    female 
} 

Not küçük harf değerlerine gibi enum tanımlamak için deneyin.

Bu, en azından VARCHAR sütunlarıyla çalışır. Enum'u "erkek" veya "dişi" olarak depolar. Bir sütun tanımını Hazırda verirsek

+2

Yazıldığı gibi, enum type sütunu kullanıyorum, varchar değil – niklassaers

+4

önerim denedim mi? mysql cinsinden cinsiyet türü muhtemelen bir varchar veya char sütunu etrafında bir miktar sarma/sözdizimsel şekerdir –

23

, bu bir tahmin etmeye olmaz: Eğer herhangi bir nedenle şema oluşturmak için hazırda güvenerek değilseniz

@Column(columnDefinition = "enum('MALE','FEMALE')") 
@Enumerated(EnumType.STRING) 
private Gender gender; 

, hatta yok columnDefinition için gerçek değerler sağlamak. Bu şekilde, değerleri senkronize halde tutmanız gereken bir örneği kaldırırsınız. Bu durum için

@Column(columnDefinition = "enum('DUMMY')") 
@Enumerated(EnumType.STRING) 
private ManyValuedEnum manyValuedEnum; 
3

değil ama birisi XML eşlemesi kullanıyorsa: Sadece senkronize Java enum ve Liquibase veya SQL komut dosyası tutmak

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

veritabanı sütun tipi sayısal örn olmalıdır Mysql üzerinde minik değer okumak mümkündür.

5

değil hazırda belgelerinde emin değil neden ama bu

<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, bu bir MySQL ENUM sütunuyla iyi çalışır, ancak 12 VARCHAR – arun

+0

içindir Bu nasıl ek açıklamalarla yapılır? – rajadilipkolli

İlgili konular