Сохранять коллекцию enum в базе данных, используя ORMLite - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь сохранить коллекцию enum в базе данных с помощью 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) ~[?:?]

Я хотел бы сохранить эту коллекцию в виде перечисления, потому что она более удобна

1 Ответ

1 голос
/ 31 марта 2019

Чтобы решить эту проблему, я просто использовал любую коллекцию из пакета java.util и установил аннотацию @DatabaseField(dataType=DataType.SERIALIZABLE) вместо @ForeignCollectionField для сохранения сериализованных данных, поэтому теперь код равен

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

Важно установить тип HashSet в поле, поскольку ORMLite не обнаружит сериализуемый интерфейс на Set.

...