Grails Enum Mapping

ken picture ken · Sep 20, 2010 · Viewed 23.5k times · Source

in Grails, Is there a way to limit the size of the column to which the enum is mapped. In the following example, i would like the column type to be 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)
    }
}

both inList and size do not have any effect when exporting the schema, the column type keeps its default value (varch(255)) Maybe i could do that if i define a new UserType. Any idea ?

Thank you -ken

Answer

Burt Beckwith picture Burt Beckwith · Sep 20, 2010

I don't think it's directly possible given the way enums are mapped internally in GORM. But changing the code to this works:

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

and

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

Adding the transient getter and setter allows you to set or get either the String (id) or enum value.