2010-06-15 6 views
16

J'essaie de persister la classe suivante avec OrmLite:Est-il possible d'avoir un champ enum dans une classe persisté avec OrmLite?

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

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

Le FieldType est un public enum. Le champ correspondant à type est une chaîne dans SQLite (ne prend pas en charge les énumérations). Lorsque je tente de l'utiliser, je reçois l'exception suivante:

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 

Alors, comment puis-je dire OrmLite, les valeurs du côté Java sont d'un enum?

Répondre

39

ORMLite peut persister énumérations soit comme VARCHAR enum name (default):

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

Comme alternative, vous pouvez enregistrer le ordinal INTEGER.

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

Bien que vous pouvez stocker l'ordinal, la version du nom VARCHAR (qui est la valeur par défaut) est recommandée car la valeur ordinale peut changer si vous ajoutez ou supprimez des entrées de la ENUM.

Pour les deux types d'énumération, vous pouvez spécifier un unknownEnumName = "..." field qui facilite la compatibilité ascendante et descendante. Si la base de données contient une valeur inconnue pour l'énumération, l'objet renvoyé par les DAO aura cette valeur enum.

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

Merci, vous faites du bon travail, de toute façon pensez-vous qu'il serait préférable de vous contacter via le formulaire ou ce site? Je suppose que ce dernier pourrait économiser votre temps quand les gens google pour ce qu'ils veulent d'abord – htf

+0

Pourquoi est-il recommandé d'utiliser ENUM_INTEGER? Sûrement, le nom de l'entrée enum est moins susceptible de changer que l'ordre ou le montant des entrées. – pablisco

+0

Ce n'est pas recommandé. Avez-vous lu la réponse @pablisco? – Gray

Questions connexes