[英]Is it possible to have an enum field in a class persisted with OrmLite?
I'm trying to persist the following class with OrmLite : 我正在尝试使用OrmLite保留以下类:
public class Field {
@DatabaseField(id = true)
public String name;
@DatabaseField(canBeNull = false)
public FieldType type;
...
}
The FieldType
is a public enum
. FieldType
是一个public enum
。 The field, corresponding to the type
is string in SQLite (is doesn't support enums). 对应于该
type
的字段是SQLite中的字符串(不支持枚举)。 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
? 那么我如何告诉OrmLite,Java端的值来自
enum
?
ORMLite can persist enums either as the VARCHAR
enum name (default) : ORMLite可以将枚举持久化为
VARCHAR
枚举名称(默认值) :
// 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
. 作为替代方案,您可以保存序数
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. 虽然您可以存储序号,但建议使用
VARCHAR
名称版本(这是默认值),因为如果您在枚举中添加或删除条目,则序号值可能会更改。
For both enum types, you can specify an unknownEnumName = "..."
field which helps with forward and backward compatibility. 对于这两种枚举类型,您可以指定
unknownEnumName = "..."
字段 ,该字段有助于向前和向后兼容。 If the database contains an unknown value for the enum then the object that is returned by the DAOs will have this enum value. 如果数据库包含枚举的未知值,则DAO返回的对象将具有此枚举值。
@DatabaseField(unknownEnumName = "FIRST")
OurEnum ourEnum;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.