Search code examples
grailsgrails-orm

Grails Enum Mapping


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


Solution

  • 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.