有一些关于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?
答案 0 :(得分:4)
刚刚尝试使用Grails 2.3.4并使用了 src / groovy 方法:
public enum PaymentMethod {
BYBANKTRANSFERINADVANCE('BANKADVANCE'),
BYINVOICE('ByInvoice'),
CASH('Cash'),
CHECKINADVANCE('CheckInAdvance'),
PAYPAL('PayPal'),
String id
PaymentMethod(String id) {
this.id = id
}
}
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"
}