java - 使用 ORMLite 在数据库中存储枚举集合
问题描述
我正在尝试使用 ORMLite 将枚举集合保存在数据库中。因此,在创建 Dao 时,我遇到了无参数构造函数错误
我已经尝试创建默认包构造函数,但它没有帮助 - 我认为 ORMLite 需要公共构造函数,但枚举不能拥有它。
我的枚举看起来像这样(分隔的 .java 文件)
enum RankPermission {
@DatabaseField(dataType=DataType.ENUM_TO_STRING)
ALL,
//...
;
RankPermission() {}
}
另一个类的集合是
@DatabaseTable
class Rank {
@ForeignCollectionField
Collection<RankPermission> permissions;
public Rank() {}
}
我得到的道创建和错误
DaoManager.createDao(conn, Rank.class);
[23:31:12 ERROR]: Can't find a no-arg constructor for class package.core.rank.RankPermission
java.lang.IllegalArgumentException: Can't find a no-arg constructor for class package.core.rank.RankPermission
at com.j256.ormlite.table.DatabaseTableConfig.findNoArgConstructor(DatabaseTableConfig.java:229) ~[?:?]
at com.j256.ormlite.table.DatabaseTableConfig.getConstructor(DatabaseTableConfig.java:154) ~[?:?]
at com.j256.ormlite.table.TableInfo.<init>(TableInfo.java:96) ~[?:?]
at com.j256.ormlite.table.TableInfo.<init>(TableInfo.java:54) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:156) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:133) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:112) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl$5.<init>(BaseDaoImpl.java:1044) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:1044) ~[?:?]
at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:70) ~[?:?]
at com.j256.ormlite.field.FieldType.configDaoInformation(FieldType.java:392) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:206) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:133) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:112) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl$5.<init>(BaseDaoImpl.java:1044) ~[?:?]
at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:1044) ~[?:?]
at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:70) ~[?:?]
at package.storage.yaml.db.DatabaseConnector.initDaos(DatabaseConnector.java:152) ~[?:?]
我想以枚举形式保存这个集合,因为它更舒服
解决方案
为了解决这个问题,我刚刚使用了java.util
包中的任何集合并设置@DatabaseField(dataType=DataType.SERIALIZABLE)
注释而不是@ForeignCollectionField
保存序列化数据,所以现在代码是
class Rank {
@DatabaseField(dataType=DataType.SERIALIZABLE)
private HashSet<RankPermission> permissions = new HashSet<>();
}
将 type设置为 field 很重要HashSet
,因为 ORMLite 不会检测Set
.
推荐阅读
- c# - 在 Hybridizer 中使用设备内存时如何正确地将 IntPtr 转换为数组
- amazon-web-services - 无法使用 AWS SNS 发送 SMS
- css - 如何更改 pTooltip 位置以将更长的文本视为 ui-tooltip-top
- apache - CentOS 7 中的 Apache 升级
- php - 是否可以使用 twig 模板通过 makerbundle 生成 php 文件
- kotlin - RealmLists 中只允许具体的 Realm 类。接口和抽象类都不允许
- android - 是否可以以不同的名称上传两个几乎相同的应用程序?
- android-studio - 清单合并失败的android studio
- spring-kafka - IntegrationTests 的正确@EmbeddedKafka 用法是什么?
- python - Python mmap - 缓慢访问文件末尾[带有测试代码]