枚举

枚举是一组常量,可用作 实体 属性值。

在 Jmix 中,枚举是一个实现了 EnumClass 接口的 Java enum,有一个 id 字段,可以是 IntegerString 类型。存储在数据库中的是这个字段,而不是 enum 的 ordinal()name(),这样做考虑了以下优势:

  • 可以对枚举常量进行重命名和重新排序,只要保留上述 id 标识,数据模型将与数据库内容一致。

  • 即使数据库包含不对应于任何 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 每个枚举常量都使用传递给构造函数的 Id 值来定义。
3 getId()fromId() 方法用来实现 Id 和枚举常量的转换。

枚举在实体中如何使用:

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 字段为枚举 Id 的类型(IntegerString
2 getter 和 setter 实现 Id 类型和 enum 类型的转换。
在 Studio 实体设计器中创建属性时,在 Attribute type 中选择 ENUM 并在 Type 中找到对应的枚举。