简体   繁体   English

是否可以在OrmLite中保留类中的枚举字段?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM