Я пытаюсь сохранить следующий класс с 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
?
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;