Est-il possible d'avoir un champ ENUM dans une classe persisté OrmLite?
Question
Je suis en train de persister avec la classe suivante OrmLite :
public class Field {
@DatabaseField(id = true)
public String name;
@DatabaseField(canBeNull = false)
public FieldType type;
...
}
Le FieldType
est un public enum
. Le champ, correspondant à la type
est une chaîne en SQLite (est ne supporte pas les énumérations). Lorsque je tente de l'utiliser, je reçois l'exception suivante:
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
Alors, comment puis-je dire OrmLite, les valeurs du côté Java sont d'un enum
?
La solution
ORMLite peut persister énumérations soit comme VARCHAR
ENUM nom (par défaut) :
// this saves it as a string in the database
@DatabaseField
OurEnum ourEnum;
...
private enum OurEnum {
FIRST,
SECOND, ;
}
Comme alternative, vous pouvez enregistrer ordinale INTEGER
.
// this saves it as an integer in the database
@DatabaseField(dataType = DataType.ENUM_INTEGER)
OurEnum ourEnum;
Bien que vous peut stocker le ordinale, la version du nom de VARCHAR
(qui est la valeur par défaut) est recommandée car la valeur ordinale peut changer si vous ajoutez ou les entrées de supprimer de la ENUM.
Pour les deux types de ENUM, vous pouvez spécifier un champ unknownEnumName = "..."
qui contribue à la compatibilité vers l'avant et vers l'arrière . Si la base de données contient une valeur inconnue pour l'ENUM alors l'objet qui est retourné par les OTI aura cette valeur enum.
@DatabaseField(unknownEnumName = "FIRST")
OurEnum ourEnum;