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?

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top