Можно ли иметь поле Enum в классе, сохранившихся с Ormlite?

StackOverflow https://stackoverflow.com/questions/3044632

  •  27-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь сохранить следующий класс с 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top