Подтвердить что ты не робот

Возможно ли иметь поле перечисления в классе, который сохраняется в 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?

4b9b3361

Ответ 1

ORMLite может сохраняться в перечислениях как VARCHAR enum имя (по умолчанию):

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

В качестве альтернативы вы можете сохранить порядковый номер INTEGER.

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

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

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

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