Можно ли иметь поле Enum в классе, сохранившихся с Ormlite?
Вопрос
Я пытаюсь сохранить следующий класс с Ormlite.:
public class Field {
@DatabaseField(id = true)
public String name;
@DatabaseField(canBeNull = false)
public FieldType type;
...
}
То FieldType
это public enum
. Отказ Поле, соответствующее type
Строка в SQLite (не поддерживает enums). Когда я пытаюсь использовать его, я получаю следующее исключение:
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.<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
?
Решение
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
Версия имени (которая по умолчанию) рекомендуется, поскольку порядковая стоимость может измениться, если вы добавляете или удалите записи от enum.
Для обоих типов Enum вы можете указать unknownEnumName = "..."
поле который помогает с передней и обратной совместимостью. Если база данных содержит неизвестное значение для enum, то объект, который возвращается DAOS, будет иметь значение этого значения.
@DatabaseField(unknownEnumName = "FIRST")
OurEnum ourEnum;