Grails Enum Mapping - PullRequest
       6

Grails Enum Mapping

15 голосов
/ 20 сентября 2010

в 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, так и размер не влияют на экспорт схемы, тип столбца сохраняет значение по умолчанию (varch (255)) Может быть, я мог бы сделать это, если я определю новый тип пользователя.Есть идеи?

Спасибо -ken

Ответы [ 4 ]

20 голосов
/ 20 сентября 2010

Я не думаю, что это напрямую возможно, учитывая, как перечисления внутренне отображаются в 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)'
   }
}

Добавление переходного геттера и сеттера позволяет вам установить или получить либо String (id), либо значение enum.

11 голосов
/ 10 октября 2011

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' в Bootstrap.groovy, чтобы уменьшить столбец:

DataSource dataSource
...
Sql sql = new Sql(dataSource)
sql.execute("alter table my_domain_class change column status status varchar(1) not null")
2 голосов
/ 03 июля 2015

Еще проще (работает хотя бы в 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
    }
}
1 голос
/ 02 июля 2017

С помощью такой конструкции можно включить отображение идентификаторов в GORM 6.1

static mapping = {
   myEnum enumType:"identity"
}
...