Можно ли сохранить поле enum в классе с помощью OrmLite? - PullRequest
17 голосов
/ 15 июня 2010

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

1 Ответ

42 голосов
/ 18 июня 2010

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;
...