2010-06-15 5 views
16

Ich versuche, die folgende Klasse mit OrmLite bestehen bleiben:Ist es möglich, ein Enum-Feld in einer Klasse mit OrmLite beibehalten?

public class Field { 
    @DatabaseField(id = true) 
    public String name; 

    @DatabaseField(canBeNull = false) 
    public FieldType type; 
    ... 
} 

Die FieldType ist ein public enum. Das Feld, das dem type entspricht, ist eine Zeichenfolge in SQLite (es unterstützt keine enums). Wenn ich versuche, es zu verwenden, erhalte ich die folgende Ausnahme:

INFO [main] (SingleConnectionDataSource.java:244) - Established shared JDBC Connection: [email protected] 
Exception in thread "main" org.springframework.beans.factory.BeanInitializationException: Initialization of DAO failed; nested exception is java.lang.IllegalArgumentException: Unknown field class class enums.FieldType for field FieldType:name=type,class=class orm.Field 
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:51) 
at orm.FieldDAO.getInstance(FieldDAO.java:17) 
at orm.Field.fromString(Field.java:23) 
at orm.Field.main(Field.java:38) 
Caused by: java.lang.IllegalArgumentException: Unknown field class class enums.FieldType for field FieldType:name=type,class=class orm.Field 
at com.j256.ormlite.field.FieldType.<init>(FieldType.java:54) 
at com.j256.ormlite.field.FieldType.createFieldType(FieldType.java:381) 
at com.j256.ormlite.table.DatabaseTableConfig.fromClass(DatabaseTableConfig.java:82) 
at com.j256.ormlite.dao.BaseJdbcDao.initDao(BaseJdbcDao.java:116) 
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:48) 
... 3 more 

Wie kann ich feststellen, OrmLite, Werte auf der Java-Seite sind von einem enum?

Antwort

39

ORMLite kann Aufzählungen entweder als VARCHAR enum name (default) bestehen:

// this saves it as a string in the database 
@DatabaseField 
OurEnum ourEnum; 
... 
private enum OurEnum { 
    FIRST, 
    SECOND, ; 
} 

Als Alternative können Sie die ordinal INTEGER speichern.

// this saves it as an integer in the database 
@DatabaseField(dataType = DataType.ENUM_INTEGER) 
OurEnum ourEnum; 

Obwohl Sie können speichern die Ordnungs, die VARCHAR Name Version (das ist die Standardeinstellung) wird empfohlen, da die Ordnungs Wert ändern können, wenn Sie Einträge aus dem Enum hinzufügen oder entfernen.

Für beide Aufzählungstypen können Sie eine unknownEnumName = "..." field angeben, die bei der Vorwärts- und Rückwärtskompatibilität hilft. Wenn die Datenbank einen unbekannten Wert für die Enumeration enthält, hat das Objekt, das von den DAOs zurückgegeben wird, diesen Enum-Wert.

@DatabaseField(unknownEnumName = "FIRST") 
OurEnum ourEnum; 
+1

Danke, Sie machen gute Arbeit, sowieso denken Sie, es wäre besser, Sie über das Formular oder diese Seite zu kontaktieren? Ich schätze, Letzteres könnte Ihre Zeit sparen, wenn Leute nach dem suchen, was sie zuerst wollen. – htf

+0

Warum wird ENUM_INTEGER empfohlen? Sicherlich ändert sich der Name des Enum-Eintrags weniger als die Reihenfolge oder Anzahl der Einträge. – pablisco

+0

Es wird nicht empfohlen. Hast du die Antwort @pablisco gelesen? – Gray

Verwandte Themen