2010-06-15 3 views
16

Я пытаюсь упорствовать следующий класс с OrmLite:Возможно ли иметь поле перечисления в классе, сохраненном в OrmLite?

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

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

FieldType является public enum. Поле, соответствующее type, является строкой в ​​SQLite (не поддерживает перечисления). Когда я пытаюсь использовать его, я получаю следующее исключение:

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 

Так как же я говорю OrmLite, значения на стороне Java являются от enum?

ответ

39

ORMLite может сохраняться перечислений либо как VARCHAR enum name (default):

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

В качестве альтернативы, вы можете сохранить ordinal INTEGER.

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

Хотя вы можете магазин порядковое, версия VARCHAR имя (это значение по умолчанию), рекомендуется, так как порядковое значение может измениться, если вы добавлять или удалять записи из перечисления.

Для обоих типов перечислений вы можете указать unknownEnumName = "..." field, который помогает с прямой и обратной совместимостью. Если база данных содержит неизвестное значение для перечисления, тогда объект, возвращаемый DAO, будет иметь это значение перечисления.

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

Спасибо, вы отлично поработали, так или иначе, как вы думаете, было бы лучше связаться с вами через форму или этот сайт? Я думаю, последний может сэкономить ваше время, когда люди google за то, что хотят сначала – htf

+0

Почему рекомендуется использовать ENUM_INTEGER? Разумеется, название записи перечисления с меньшей вероятностью изменится, чем порядок или количество записей. – pablisco

+0

Не рекомендуется. Вы прочитали ответ @pablisco? – Gray

 Смежные вопросы

  • Нет связанных вопросов^_^