2010-01-29 25 views
35

In meiner MySQL-Datenbank, gibt es die Spalte "Geschlecht ENUM ('männlich', 'weiblich')"Enum in Hibernate, persistierende als Enum

ich meine Enum „com.mydomain.myapp.enums erstellt haben .Gender ", und in meiner Person Einheit bin ich definiert" Gender Gender ".

Jetzt würde ich mag den Aufzählungstyp in meiner MySQL-Datenbank halten, aber wenn ich meine Anwendung zu starten erhalte ich:

Falschen Spaltentyp in MyApp.Person für Spalte Geschlecht. Gefunden: enum, erwartet: integer

Warum ist das? Dies wäre das Äquivalent, als ob ich mein "Geschlechts Geschlecht" mit "@Enumerated (EnumType.ORDINAL)" kommentiert hätte, was ich nicht getan habe. EnumType scheint nur in der Lage zu sein, ORDINAL oder STRING zu sein. Wie kann ich also angeben, dass das Feld als Enum behandelt werden soll, nicht als int? (Nicht, dass es einen großen Unterschied gibt, aber genug, um sich darüber aufzuregen.)

+0

Senden ganzen Zahlen shud tun arbeiten.männlich = 1, weiblich = 2 – Cherian

+0

Mit Hibernate, wie würden Sie vorschlagen, dass ich meine Entity-Klasse annotieren, um das zu tun? Ich habe versucht, meine enum Werte explizit zu definieren "public enum Geschlecht (MALE (1), FEMALE (2);}" ohne Unterschied in der Fehlerausgabe – niklassaers

Antwort

23

Mein Verständnis ist, dass MySQL Enum Typ sehr proprietär ist und nicht gut von Hibernate unterstützt wird, siehe this comment von Gavin King (dieses Problem ist ein etwas anders, aber das ist nicht der wichtige Teil).

Also, ich glaube eigentlich, dass Sie Ihre eigenen UsereType verwenden müssen würden, und ich würde die Flexible Lösung zu verwenden, empfehlen - Version arbeitet vom Java 5 EnumUserType (siehe AppFuse der Java 5 Enums Persistence with Hibernate für ein Beispiel).

Persönlich würde ich nur die Idee, MySQL Enum zu verwenden vergessen, ich bin nicht davon überzeugt, dass die "Vorteile" es wert sind (siehe this answer für weitere Details).

18

Versuchen @Enumerated (EnumType.STRING) und definieren Sie Ihre Enum wie diese

enum Gender { 
    male, 
    female 
} 

Hinweis Kleinbuchstaben Werte zu verwenden.

Dies funktioniert zumindest mit VARCHAR-Spalten. Es wird Enum als String 'männlich' oder 'weiblich' speichern.

+2

Wie geschrieben, verwende ich enum type Spalte, nicht varchar – niklassaers

+4

Haben Sie tatsächlich versuchte mein Vorschlag? Gender-Typ in MySQL ist wahrscheinlich nur einige Wrapping/syntaktische Zucker um eine Varchar oder Char-Spalte. –

23

Wenn Sie eine Spaltendefinition Hibernate geben, wird es nicht versuchen, einen erraten:

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

Wenn Sie nicht auf den Ruhezustand setzen Ihr Schema aus irgendeinem Grund zu generieren, Sie haben nicht einmal um echte Werte für die columnDefinition bereitzustellen. Auf diese Weise entfernen Sie eine Instanz, in der Sie die Werte synchron halten müssen. So halten Sie Ihre Java-Enumeration und Ihre Liquibase oder SQL-Skript in sync:

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

Nicht für diesen Fall aber, wenn jemand XML Mapping:

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

Die Datenbankspalte Typ muss numerisch sein z.B. Tinyint auf einem MySQL, um das Lesen von Ordinalwerten zu ermöglichen.

5

nicht sicher, warum es nicht in Hibernate Dokumentation aber Sie können diese

<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, das funktioniert gut mit einer MySQL ENUM-Spalte, obwohl 12 ist für VARCHAR – arun

+0

Wie geht das mit Anmerkungen? – rajadilipkolli