在Grails域类中使用ENUM

时间:2013-12-11 08:52:32

标签: grails enums gorm

有一些关于Grails的ENUM示例(此处也在SO中),但我无法获得所需的结果。

解决方案包括 1)将ENUM放在src / groovy下的单独类中 域类

class Offer {
    PaymentMethod acceptedPaymentMethod 
    ..
}

src / groovy PaymentMethod

public enum PaymentMethod {
    BYBANKTRANSFERINADVANCE('BANKADVANCE'),
    BYINVOICE('ByInvoice'),
     CASH('Cash'),
    CHECKINADVANCE('CheckInAdvance'),
    PAYPAL('PayPal'),
    String id

    PaymentMethod(String id) {
        this.id = id
    }
}

在这种情况下,在发出错误的域类中根本无法识别Enum类。看起来这个曾经在版本2之前用于Grails。

我在这里遗漏了什么吗?如何在Grails中的域中使用外部ENUM类?

2)将ENUM放在域类中。

在这种情况下,grails在编译时不会抱怨,但是脚手架不包含ENUM值的任何信息(就像在scaffolding过程中不包含属性acceptedPaymentMethod) 示例:

class Offer {
    PaymentMethod acceptedPaymentMethod 
    ..
    enum PaymentMethod {
        BYBANKTRANSFERINADVANCE('BANKADVANCE'),
        BYINVOICE('ByInvoice'),
        CASH('Cash'),
        CHECKINADVANCE('CheckInAdvance'),
        PAYPAL('PayPal'),
        String id

        PaymentMethod(String id) {
            this.id = id
        }
    }
}

检查数据库表的结构,该字段不是ENUM而是简单的VarChar:

| accepted_payment_method        | varchar(255) | YES  |     | NULL    |                |

Grails Gorm上是否支持ENUM?

2 个答案:

答案 0 :(得分:4)

刚刚尝试使用Grails 2.3.4并使用了 src / groovy 方法:

的src /常规/ PaymentMethod.groovy

public enum PaymentMethod {
    BYBANKTRANSFERINADVANCE('BANKADVANCE'),
    BYINVOICE('ByInvoice'),
     CASH('Cash'),
    CHECKINADVANCE('CheckInAdvance'),
    PAYPAL('PayPal'),
    String id

    PaymentMethod(String id) {
        this.id = id
    }
}

的grails-app /域/ CustomDomain.groovy

class CustomDomain {
  PaymentMethod acceptedPaymentMethod
}

然后我运行了grails generate-all CustomDomain,这是_form.gsp生成的:{/ p>

<div class="fieldcontain ${hasErrors(bean: customDomain, field: 'acceptedPaymentMethod', 'error')} required">
    <label for="acceptedPaymentMethod">
        <g:message code="customDomain.acceptedPaymentMethod.label" default="Accepted Payment Method" />
        <span class="required-indicator">*</span>
    </label>
    <g:select name="acceptedPaymentMethod" from="${custombinds.PaymentMethod?.values()}" keys="${custombinds.PaymentMethod.values()*.name()}" required="" value="${customDomain?.acceptedPaymentMethod?.name()}"/>
</div>

请注意,在Grails 2.3.x中,脚手架功能已转换为插件,因此您需要在BuildConfig.groovy中包含以下内容:

compile ":scaffolding:2.0.1"

答案 1 :(得分:1)

由于GORM 6.1 IdentityEnumType处理已更改。为了按ID存储枚举而不是按名称或使用

static mapping = {
  myEnum enumType:"identity"
}