Grails Enum Mapping

时间:2010-09-20 04:48:09

标签: grails gorm

Grails中的

,是否有办法限制枚举枚举的列的大小。在以下示例中,我希望列类型为char(2)

enum FooStatus {
    BAR('br'), TAR('tr')
    final static String id
}

class Foo {
    FooStatus status

    static constraints = {
        status(inList:FooStatus.values()*.id,size:2..2)
    }
}

在导出架构时,inList和size都没有任何效果,列类型保持其默认值(varch(255)) 如果我定义一个新的UserType,也许我可以这样做。有什么想法吗?

谢谢 -ken

4 个答案:

答案 0 :(得分:20)

鉴于枚举在GORM内部映射的方式,我认为这不可能直接实现。但是将代码更改为有效:

enum FooStatus {
   BAR('br'),
   TAR('tr')
   private FooStatus(String id) { this.id = id }
   final String id

   static FooStatus byId(String id) {
      values().find { it.id == id }
   }
}

class Foo {
   String status

   FooStatus getFooStatus() { status ? FooStatus.byId(status) : null }
   void setFooStatus(FooStatus fooStatus) { status = fooStatus.id }

   static transients = ['fooStatus']

   static constraints = {
      status inList: FooStatus.values()*.id
   }

   static mapping = {
      status sqlType: 'char(2)'
   }
}

添加transient getter和setter可以设置或获取String(id)或enum值。

答案 1 :(得分:11)

Grails附带了一个未记录的(据我所知,无论如何)枚举的自定义Hibernate映射。该类是org.codehaus.groovy.grails.orm.hibernate.cfg.IdentityEnumType。它不会让您设置列大小,但可以轻松更改每个枚举值在DB中存储的内容,而无需向模型添加瞬态字段。

import org.codehaus.groovy.grails.orm.hibernate.cfg.IdentityEnumType

class MyDomainClass {
    Status status

    static mapping = {
        status(type: IdentityEnumType)
    }

    enum Status {
        FOO("F"), BAR("B")
        String id
        Status(String id) { this.id = id }
    }
}

您可以在Bootstrap.groovy中运行'alter table'来缩小列:

DataSource dataSource
...
Sql sql = new Sql(dataSource)
sql.execute("alter table my_domain_class change column status status varchar(1) not null")

答案 2 :(得分:2)

更简单(至少在Grails 2.1.0 +中起作用)

class DomainClass {
    Status status
    static mapping = {
         status(enumType: "string")
    }
}
enum Status {
    OPEN     ("OPEN"),
    CLOSED   ("CLOSED"),
    ...

    String name
    Status (String name) {
        this.name = name
    }
}

答案 3 :(得分:1)

由于可以使用此类构造启用GORM 6.1身份枚举映射

static mapping = {
   myEnum enumType:"identity"
}