首页 > 解决方案 > 使用 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) ~[?:?]

我想以枚举形式保存这个集合,因为它更舒服

标签: javadatabaseenumsormlite

解决方案


为了解决这个问题,我刚刚使用了java.util包中的任何集合并设置@DatabaseField(dataType=DataType.SERIALIZABLE)注释而不是@ForeignCollectionField保存序列化数据,所以现在代码是

class Rank {
    @DatabaseField(dataType=DataType.SERIALIZABLE)
    private HashSet<RankPermission> permissions = new HashSet<>();
}

将 type设置为 field 很重要HashSet,因为 ORMLite 不会检测Set.


推荐阅读