Play中的“ChoiceField”(或:更好的JPA Enum)?

时间:2011-12-15 23:24:17

标签: java django jpa playframework

我非常习惯Django 'choices' option的模型字段:

GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

对于模型字段,它允许轻松地将数据库值与(表示)字符串匹配。并且可以选择任何sql类型(Char,Int ...)

在JPA中,这是不可能的;你可以制作一个枚举:但只能使用它的序数或字符串。我发现过于限制和复杂。

是否有游戏!类似于Django choices的东西,特别是与CRUD一起使用?

或者至少是CRUD的模式,而不仅仅是为模型字段声明一个简单的String或int?

相关:

2 个答案:

答案 0 :(得分:1)

我不明白您使用Enum的问题,您可以像这样使用JPA映射enum

@Enumerated(EnumType.STRING)
public GenderChoice genderChoice;

在代码中使用枚举。这还不够吗?

答案 1 :(得分:1)

基于@SebCesbron评论这是我现在使用的那种模式......

@Required
@Enumerated(EnumType.STRING)
public MyEnumType myenum;


public enum MyEnumType {

    ENUMONE ("label one", 1),
    ENUMTWO ("label two", 2);

    String label;
    Int value;

    CastType(String label, Int value) {            
        this.value = value;
        this.label = label;
    }

    @Override
    public String toString() {
        return this.label;
    }

    public Int getValue() {
        return this.value;
    }

    public String getLabel()
    {
        return label;
    }

}

使用EnumType.STRING数据库将包含枚举项名称 - 覆盖toString不会影响该名称,因为JPA使用最终的name()

那么我的确切用法和问题是:

@Required
@Enumerated(EnumType.STRING)
public GenderEnum myenum;


public enum GenderEnum {

    M ("Male"),
    F ("Female");

    String label;

    CastType(String label) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.label;
    }
}