Is it possible to have an enum field in a class persisted with OrmLite?
ORMLite can persist enums either as the VARCHAR
enum name (default):
// this saves it as a string in the database
@DatabaseField
OurEnum ourEnum;
...
private enum OurEnum {
FIRST,
SECOND, ;
}
As an alternative, you can save the ordinal INTEGER
.
// this saves it as an integer in the database
@DatabaseField(dataType = DataType.ENUM_INTEGER)
OurEnum ourEnum;
Although you can store the ordinal, the VARCHAR
name version (which is the default) is recommended since the ordinal value can change if you add or remove entries from the enum.
For both enum types, you can specify an unknownEnumName = "..."
field which helps with forward and backward compatibility. If the database contains an unknown value for the enum then the object that is returned by the DAOs will have this enum value.
@DatabaseField(unknownEnumName = "FIRST")
OurEnum ourEnum;
Related videos on Youtube
htf
Updated on April 25, 2022Comments
-
htf about 2 years
I'm trying to persist the following class with OrmLite:
public class Field { @DatabaseField(id = true) public String name; @DatabaseField(canBeNull = false) public FieldType type; ... }
The
FieldType
is apublic enum
. The field, corresponding to thetype
is string in SQLite (is doesn't support enums). When I try to use it, I get the following exception: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
So how do I tell OrmLite, values on the Java side are from an
enum
? -
htf about 14 yearsThanks, you're doing great job, anyways do you think it would be better to contact you via the form or this site? I guess the latter could save your time when people google for what they want first
-
pablisco over 10 yearsWhy is it recommended to use ENUM_INTEGER? Surely, the name of the enum entry is less likely to change than the order or amount of entries.
-
pablisco over 10 yearsAh! sorry. My bad, I miss read it :) since it was after talking about
ENUM_INTEGER
my brain thought that next paragraph was talking aboutENUM_INTEGER
and notVARCHAR