代码之家  ›  专栏  ›  技术社区  ›  ken

Grails枚举映射

  •  15
  • ken  · 技术社区  · 14 年前

    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)) 如果我定义一个新的用户类型,也许我可以做到这一点。你知道吗?

    谢谢你 -肯

    4 回复  |  直到 14 年前
        1
  •  20
  •   Burt Beckwith    14 年前

    我不认为这是直接可能的,因为枚举是在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)'
       }
    }
    

    添加临时getter和setter可以设置或获取字符串(id)或枚举值。

        2
  •  11
  •   David Tinker    13 年前

    Grails附带了一个用于枚举的无文档(据我所知)自定义Hibernate映射。这个班是org.codehaus.groovy公司.grails.orm.hibernate文件.cfg.IdentityEnumType类型. 它不允许您设置列大小,但是可以很容易地为每个枚举值更改数据库中存储的内容,而不必向模型中添加临时字段。

    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 }
        }
    }
    

    可以在中运行“alter table”引导.groovy要缩小列:

    DataSource dataSource
    ...
    Sql sql = new Sql(dataSource)
    sql.execute("alter table my_domain_class change column status status varchar(1) not null")
    
        3
  •  2
  •   Alex Abdugafarov    9 年前

    更简单(至少在grails2.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
        }
    }
    
        4
  •  1
  •   Semyon Atamas    7 年前

    static mapping = {
       myEnum enumType:"identity"
    }
    
    推荐文章