Действительно ли возможно иметь перечислимое поле в классе, сохраненном с OrmLite?

Я пытаюсь сохранить следующий класс с OrmLite:

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

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

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

INFO [main] (SingleConnectionDataSource.java:244) - Established shared JDBC Connection: org.sqlite.Conn@5224ee
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.(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?

17
задан Gray 1 June 2012 в 15:00
поделиться

1 ответ

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

// 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;
42
ответ дан 30 November 2019 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: