Перечисления

Перечисление – это набор констант, которые можно использовать в качестве значений атрибута сущности.

В Jmix перечисление – это тип Java enum, который реализует интерфейс EnumClass и имеет поле id типа Integer или String. Это поле хранится в базе данных вместо ordinal() или name() константы перечисления, что имеет следующие преимущества:

  • Вы можете переименовывать и переупорядочивать константы enum, и пока вы не измените идентификаторы, ваша модель данных будет совместима с содержимым базы данных.

  • Даже если база данных содержит значение, которое не соответствует ни одной из констант enum (это может произойти, если старая и новая версии приложения работают с одной и той же базой данных), сущность все равно может быть загружена с атрибутом enum, содержащим null. При стандартном JPA подходе загрузка такого экземпляра невозможна вообще.

Используйте дизайнер перечислений Studio для создания перечислений Jmix.

Ниже приведен пример класса перечисления Jmix:

CustomerGrade.java
public enum CustomerGrade implements EnumClass<String> { (1)

    BRONZE("B"), (2)
    GOLD("G"),
    PLATINUM("P");

    private String id;

    CustomerGrade(String value) {
        this.id = value;
    }

    public String getId() { (3)
        return id;
    }

    @Nullable
    public static CustomerGrade fromId(String id) { (3)
        for (CustomerGrade at : CustomerGrade.values()) {
            if (at.getId().equals(id)) {
                return at;
            }
        }
        return null;
    }
}
1 Интерфейс EnumClass параметризуется типом поля Id (в данном случае String).
2 Каждая константа enum задается с соответствующим значением Id, передаваемым конструктору.
3 Методы getId() и fromId() методы преобразуют константу enum в ее Id и обратно.

Enum должен использоваться в сущности следующим образом:

Customer.java
@Column(name = "GRADE")
private String grade; (1)

public CustomerGrade getGrade() { (2)
    return grade == null ? null : CustomerGrade.fromId(grade);
}

public void setGrade(CustomerGrade grade) { (2)
    this.grade = grade == null ? null : grade.getId();
}
1 Персистентное поле имеет тип идентификатора enum (Integer или String).
2 Геттер и сеттер преобразуют тип Id в тип enum и обратно.
При создании атрибута в дизайнере сущностей Studio, выберите ENUM в поле Attribute type и найдите ваш enum в поле Type.